Ninject 2 Iniezione Proprietà in ActionFilterAttribute non funziona
-
20-09-2019 - |
Domanda
Ho un attributo metodo che prevede diverse proprietà da iniettare da Ninject 2, ma userSession
e jobRepository
stanno arrivando nullo:
[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);
}
}
E qui è il metodo nel controller:
[AcceptGet, Job]
public ActionResult Dimensions(Job job) {
return View(job.Building);
}
So di avere la messa a punto di lavoro, perché se io uso l'iniezione del costruttore sul controller parametri del regolatore vengono iniettati. Questo non mi aiuta molto per gli attributi che però necessità di utilizzare l'iniezione di proprietà. Mi sto perdendo qualcosa qui?
Ecco le pozioni pertinenti della 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>();
}
}
Soluzione
Ninject2 non fa iniezione campo, cambiarli per immobili con un setter pubblico.
class JobAttribute : ActionFilterAttribute {
[Inject]
public IUserSession UserSession
{ set; private get; }
[Inject]
public IJobRepository JobRepository
{ set; private get; }
}
Le cose che erano in Ninject 1.x che non sono in Ninject 2:
- iniezione Campo: Ninject 2 del iniezione è ora guidato da espressione alberi, e in .NET 3.5 non c'è modo per impostare valori di campo con un'espressione albero. Poiché si tratta di una cattiva pratica in ogni caso, ho deciso di tagliarla.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow