加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-2 – 使用Ninject 2在基本控制器中的属性注入

发布时间:2020-12-16 06:57:31 所属栏目:asp.Net 来源:网络整理
导读:我在Global.aspx中有以下代码 protected override void OnApplicationStarted(){ AreaRegistration.RegisterAllAreas(); RegisterRoutes(RouteTable.Routes); RegisterAllControllersIn(Assembly.GetExecutingAssembly());}protected override IKernel Creat
我在Global.aspx中有以下代码

protected override void OnApplicationStarted()
{
    AreaRegistration.RegisterAllAreas();
    RegisterRoutes(RouteTable.Routes);
    RegisterAllControllersIn(Assembly.GetExecutingAssembly());
}

protected override IKernel CreateKernel()
{
    return new StandardKernel(new ServiceModule());
}

我还有以下Ninject模块:

internal class ServiceModule : NinjectModule
{
    public override void Load()
    {
        Bind<IProductService>().To<ProductService>().InRequestScope();
    }
}

我还有一个基本控制器:

public class BaseController : Controller
{
    [Inject]
    public IProductService ProductService
    {
        get;
        set;
    }
}

这段代码有效.我遇到的问题是我想从基本控制器中删除inject属性,并在Ninject ServiceModule中指定它.换句话说,我如何在ServiceModule中编写绑定规则,告诉Ninject将ProductService注入基本控制器的属性?

如果我删除该属性,我将得到NullReferenceException.

解决方法

基于约定的绑定生活在 http://github.com/ninject/ninject.extensions.conventions中 – 一个实现IBindingGenerator.这主要涉及发现接口和服务.

通常,构造函数注入是一种很好的默认方法.然而,ASP.NET MVC的工作方式使得这更难做(因此FubuMVC等).因此,物业注入是下一个最佳选择.

您可能会发现在Bind中使用OnActivation可能会让您做得足够 – 如果可以的话,这是迄今为止最简单的.

我将描述您尝试做的基于约定的激活.问题是:

>决定你要自动注射的是什么.你打算注入一些不具体的公共场合吗?你的内核知道的一切?除非您能够对您想要做的事情做出清晰的定义,否则注射过程可能会变得难以预测且难以理解.你最终调试并向同事解释了很多.
>提高效率. Ninject在幕后动态生成代码以使实例的激活有效(即,在走向类的时候寻找[Inject]标记,它会生成一次代码然后进行jitted,就好像你是用手写的那样).

查看代码,OOTB没有简单的方法.看起来像添加自定义IInjectionHeuristic就可以了.

但是,如果你深入了解容器,你需要

>暂停,看看你是否可以通过不走这条路来保持简单>转到ninject邮件列表并搜索类似的内容>如果您仍想这样做,请在那里发送邮件.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读