Внедрение свойства Ninject 2 для ActionFilterAttribute не работает

У меня есть атрибут метода, который ожидает, что несколько свойств будут введены Ninject 2, но userSession и jobRepository имеют значение 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);
    }
}

А вот метод в контроллере:

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

Я знаю, что у меня работает установка, потому что, если я использую инъекцию конструктора на контроллере, параметры контроллера вводятся. Это не очень помогает мне для атрибутов, хотя для этого нужно использовать инъекцию свойств. Я что-то упустил здесь?

Вот соответствующие зелья 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>();
    }
}

person DavGarcia    schedule 15.02.2010    source источник


Ответы (1)


Ninject2 не вводит поля, измените их на свойства с помощью общедоступного сеттера.

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

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

Из объявления о бета-версии Ninject 2:

Вещи, которые были в Ninject 1.x, но которых нет в Ninject 2:

  • Внедрение полей: внедрение Ninject 2 теперь управляется деревьями выражений, а в .NET 3.5 нет возможности устанавливать значения полей с помощью дерева выражений. Поскольку это в любом случае плохая практика, я решил сократить ее.
person Lachlan Roche    schedule 15.02.2010
comment
Вот и все! Свойства должны иметь общедоступный сеттер для внедрения Ninject. Я бы не подумал, что это имеет значение. - person DavGarcia; 16.02.2010
comment
Спасибо за этот ответ - я везде искал решение именно этой проблемы. - person Mustafakidd; 28.02.2011