سؤال

لديّ سمة طريقة تتوقع حقن العديد من الخصائص بواسطة Ninject 2 ، ولكن userSession و jobRepository قادمون على أنها خالية:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class JobAttribute : ActionFilterAttribute {
    [Inject]
    private IUserSession userSession;

    [Inject]
    private IJobRepository jobRepository;

    public override void OnActionExecuting(ActionExecutingContext filterContext) {
        var filter = new JobFilter(userSession, jobRepository);

        filter.OnActionExecuting(filterContext);
    }
}

وهنا الطريقة في وحدة التحكم:

[AcceptGet, Job]
public ActionResult Dimensions(Job job) {
    return View(job.Building);
}

أعلم أن لدي الإعداد يعمل لأنه إذا استخدمت حقن المنشئ على وحدة التحكم ، يتم حقن معلمات وحدة التحكم. هذا لا يساعدني كثيرًا على السمات على الرغم من الحاجة إلى استخدام حقن الممتلكات. نسيت شيئا ما هنا؟

فيما يلي الجرعات ذات الصلة من Global.asax.cs:

public class MvcApplication : Ninject.Web.Mvc.NinjectHttpApplication {
    protected override void OnApplicationStarted() {
        RegisterRoutes(RouteTable.Routes);
        RegisterAllControllersIn(Assembly.GetExecutingAssembly());
    }

    ...snip...

    protected override IKernel CreateKernel() {
        return new StandardKernel(
            new RepositoryConfiguration(),
            new AuthenticationModule(),
            new AutoMapperConfiguration()
        );
    }
}

public class RepositoryConfiguration : NinjectModule {
    public override void Load() {
        Bind<ICustomerRepository>().To<CustomerRepository>();
        Bind<IJobRepository>().To<JobRepository>();
    }
}

public class AuthenticationModule : NinjectModule {
    public override void Load() {
        Bind<MbdQuote.Core.AppService.IUserSession>().To<UserSession>();
    }
}
هل كانت مفيدة؟

المحلول

Ninject2 لا يقوم بالحقن الميداني ، ويغيرها إلى خصائص مع مراسلة عامة.

class JobAttribute : ActionFilterAttribute {
    [Inject]
    public IUserSession UserSession
    { set; private get; }

    [Inject]
    public IJobRepository JobRepository
    { set; private get; }
}

من Ninject 2 Beta إعلان:

الأشياء التي كانت في Ninject 1.x ليست في Ninject 2:

  • الحقن الميداني: حقن Ninject 2 مدفوعًا الآن بأشجار التعبير ، وفي .NET 3.5 لا توجد طريقة لضبط قيم المجال مع شجرة تعبير. بما أن هذه ممارسة سيئة على أي حال ، قررت قطعها.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top