Ninje 2 injeção de propriedade para actionfilterattribute não funcionando
-
20-09-2019 - |
Pergunta
Eu tenho um atributo de método que espera que várias propriedades sejam injetadas pelo Ninject 2, mas userSession
e jobRepository
estão chegando como nulo:
[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 aqui está o método no controlador:
[AcceptGet, Job]
public ActionResult Dimensions(Job job) {
return View(job.Building);
}
Eu sei que tenho a configuração funcionando porque, se eu usar a injeção de construtor no controlador, os parâmetros do controlador serão injetados. Isso não me ajuda muito por atributos, embora esse precise usar a injeção de propriedades. Estou perdendo alguma coisa aqui?
Aqui estão as poções pertinentes do 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>();
}
}
Solução
O Ninject2 não faz injeção de campo, altera -os para propriedades com um setter público.
class JobAttribute : ActionFilterAttribute {
[Inject]
public IUserSession UserSession
{ set; private get; }
[Inject]
public IJobRepository JobRepository
{ set; private get; }
}
Do ninje 2 beta anúncio:
Coisas que estavam em Ninject 1.x que não estão no Ninject 2:
- Injeção de campo: A injeção do Ninject 2 agora é acionada por árvores de expressão e, no .NET 3.5, não há como definir valores de campo com uma árvore de expressão. Como essa é uma péssima prática de qualquer maneira, decidi cortá -lo.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow