ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c#-在Ninject中允许将IKernel注入位置吗?

2019-10-31 14:05:06  阅读:355  来源: 互联网

标签:dependency-injection ninject c


我目前正在学习Ninject和依赖项注入,在当前设置中,我将IKernel传递到各个地方,以便其他类可以实例化某些类或获取工厂实例.

目前,我将工厂绑定为单例,然后将IKernel传递到对象中然后执行_kernel.Get< ISomethingFactory>().CreateSomething()似乎有点代码气味,并且只是将Ninject变成了荣耀服务定位器.

而且,我的工厂正在传递IKernel,因此它们可以解析所创建的各个接口的绑定实现.

我的问题是:

>工厂是否可以以这种方式运行,还是工厂应该简单地实例化具体类型本身?
>我应该赞成通过构造函数传递工厂/其他服务,而不是在各处传递IKernel?

解决方法:

我不喜欢..但是那只是我.

另外,我不开设自己的工厂..我使用Ninjects工厂扩展.你可以在这里找到它:

https://github.com/ninject/ninject.extensions.factory

基本上,您可以像平常一样创建绑定,但是随后您可以为工厂创建接口(假设此处为WinForms):

public interface IMainFormFactory {
    frmLogin CreateLoginForm();
    frmSettings CreateSettingsForm();
    IRepository<MainFormModel> CreateMainFormRepository();
}

..并将其与ToFactory扩展绑定:

using Ninject.Factories; // can't quite remember namespace at the moment

public class FactoryModule : NinjectModule {
    protected override void Load() {
        Bind<IMainFormFactory>().ToFactory();
    }
}

factorys扩展不需要您定义此接口的具体实现.它已经知道您可以根据提供的绑定来处理这些对象(并且仍将实例化尚未定义绑定的任何对象.) (例如表单).它在后台创建了一个管理器,可以为您实现此界面.

因此,您可以执行以下操作:

private readonly IMainFormFactory _factory;

public frmMainForm(IMainFormFactory factory) {
    _factory = factory;
}

public void btnSettings_Click(object sender, EventArgs e) {
    // show the settings form..
    var settingsForm = _factory.CreateSettingsForm();
    settingsForm.ShowDialog();
}

..then也会在frmSettings中注入:

public frmSettings(ISettingsFormFactory factory) {
    // as above except for ISettingsFactory
}

..这就是我选择做事的方式.也许其他人有更好的主意(我也想听听他们的意见!).

标签:dependency-injection,ninject,c
来源: https://codeday.me/bug/20191031/1976427.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有