7

Tôi đã một thuộc tính phương pháp mà hy vọng một vài thuộc tính được tiêm bởi Ninject 2, nhưng userSessionjobRepository đang mọc lên như null:Ninject 2 tiêm tài sản cho ActionFilterAttribute không làm việc

[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); 
    } 
} 

Và đây là phương pháp trong bộ điều khiển:

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

Tôi biết tôi có thiết lập làm việc vì nếu tôi sử dụng bộ khởi tạo trên bộ điều khiển thì tham số của bộ điều khiển sẽ được tiêm. Điều đó không giúp tôi nhiều cho các thuộc tính mặc dù cần phải sử dụng tiêm tài sản. Am i thiếu cái gì ở đây?

Dưới đây là các potions thích hợp của 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>(); 
    } 
} 

Trả lời

13

Ninject2 không làm tiêm lĩnh vực, thay đổi chúng để các thuộc tính với một setter công cộng.

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

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

Từ Ninject 2 Beta announcement:

Những điều đó là trong Ninject 1.x rằng đang không ở trong Ninject 2:

tiêm Dòng
  • : Ninject tiêm 2 là bây giờ được điều khiển bởi biểu thức cây và trong .NET 3.5 không có cách nào để đặt giá trị trường bằng biểu thức cây. Vì đây là một thực tế xấu dù sao, tôi quyết định cắt nó.
+0

Vậy đó! Các tài sản phải có một setter công cộng để được tiêm bởi Ninject. Tôi sẽ không nghĩ rằng đó sẽ là vấn đề. – DavGarcia

+0

Cảm ơn câu trả lời này - Tôi đã tìm kiếm ở mọi nơi giải pháp cho vấn đề chính xác này. – Mustafakidd

Các vấn đề liên quan