【问题标题】:Ninject 2 Property Injection for ActionFilterAttribute not workingActionFilterAttribute 的 Ninject 2 属性注入不起作用
【发布时间】:2010-02-15 23:06:17
【问题描述】:

我有一个方法属性,它期望 Ninject 2 注入几个属性,但 userSessionjobRepository 出现为空:

[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>();
    }
}

【问题讨论】:

    标签: c# asp.net-mvc ninject actionfilterattribute property-injection


    【解决方案1】:

    Ninject2 不进行字段注入,将它们更改为具有公共设置器的属性。

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

    来自 Ninject 2 Beta announcement

    Ninject 1.x 中的东西 不在 Ninject 2 中:

    • 现场注入:Ninject 2 注入现在由表达式驱动 树,在 .NET 3.5 中没有办法 用表达式设置字段值 树。因为这是一个不好的做法 无论如何,我决定剪掉它。

    【讨论】:

    • 就是这样!这些属性必须有一个公共的设置器才能被 Ninject 注入。我不会认为这很重要。
    • 感谢您的回答 - 我到处寻找解决这个确切问题的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多