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>();
    }
}
Foi útil?

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
scroll top