Ninject 2 Property Injection für Action nicht funktioniert
-
20-09-2019 - |
Frage
Ich habe ein Verfahren Attribut, das mehr Eigenschaften erwartet von 2 Ninject injiziert werden, aber userSession
und jobRepository
anstehen als null:
[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);
}
}
Und hier ist das Verfahren in der Steuerung:
[AcceptGet, Job]
public ActionResult Dimensions(Job job) {
return View(job.Building);
}
Ich weiß, dass ich das Setup-Arbeits haben, denn wenn ich Konstruktor Injektion auf dem Controller die Parameter der Controller injiziert bekommen. Das hilft mir nicht viel für Attribute obwohl diese Notwendigkeit zu verwenden Eigenschaft Injektion. Bin ich etwas fehlt hier?
Hier sind die einschlägigen Tränken von 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>();
}
}
Lösung
Ninject2 nicht Feldeinkopplung tun, sie mit einem öffentlichen Setter Eigenschaften ändern.
class JobAttribute : ActionFilterAttribute {
[Inject]
public IUserSession UserSession
{ set; private get; }
[Inject]
public IJobRepository JobRepository
{ set; private get; }
}
Von der Ninject 2 Beta Ankündigung :
Dinge, die in Ninject 1.x waren, dass in Ninject ist nicht 2:
- Feld Injektion: Ninject 2 des Injektion wird nun durch die Expression angetrieben Bäume, und in .NET 3.5 gibt es keine Möglichkeit Set zur Feldwert mit einem Expressions Baum. Da es sich um eine schlechte Praxis wie auch immer, ich beschlossen, es zu schneiden.