- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在学习 Ninject 和依赖项注入(inject),在我当前的设置中,我将 IKernel 传递到一些地方,以便其他类可以实例化某些类或获取工厂实例。
目前我已经将我的工厂绑定(bind)为单例,并将 IKernel 传递给一个对象然后执行 _kernel.Get<ISomethingFactory>().CreateSomething()
看起来它可能有点代码味道,只是将 Ninject 变成了一个美化的服务定位器。
此外,我的工厂正在传递 IKernel,因此它们可以解析它们创建的相应接口(interface)的绑定(bind)实现。
我的问题是:
是否允许工厂以这种方式运行,或者工厂应该简单地实例化具体类型本身?
我应该赞成通过构造函数传递工厂/其他服务,而不是到处传递 IKernel 吗?
最佳答案
我不想……但这就是我。
此外,我不推出自己的工厂。我使用 Ninjects Factories 扩展。你可以在这里找到它:
https://github.com/ninject/ninject.extensions.factory
基本上,您像往常一样创建绑定(bind),但随后您为工厂创建接口(interface)(假设这里是 WinForms):
public interface IMainFormFactory {
frmLogin CreateLoginForm();
frmSettings CreateSettingsForm();
IRepository<MainFormModel> CreateMainFormRepository();
}
..并将其与 ToFactory
扩展绑定(bind):
using Ninject.Factories; // can't quite remember namespace at the moment
public class FactoryModule : NinjectModule {
protected override void Load() {
Bind<IMainFormFactory>().ToFactory();
}
}
工厂扩展不需要你定义这个接口(interface)的具体实现..它已经知道如何根据你提供的绑定(bind)来处理这些对象(并且仍然会实例化你没有定义绑定(bind)的任何东西对于..例如表单。它在幕后创建了一个为您实现此接口(interface)的管理器)。
那么,你可以这样做:
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();
}
..然后在 frmSettings 中它也会注入(inject):
public frmSettings(ISettingsFormFactory factory) {
// as above except for ISettingsFactory
}
..这就是我选择做事的方式。也许其他人有更好的想法(我也有兴趣听听他们的想法!)。
关于c# - 在 Ninject 中是否允许将 IKernel 注入(inject)到一些地方?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13813681/
我在几个代码示例中看到人们使用 IKernel 而不是使用 IWindsorContainer。为什么是这样? 这是一个例子:http://docs.castleproject.org/(S(kwaa
当我尝试使用下面的解决方案将 Ninject 3 与 MVC 4 RC Web Api 项目一起使用时,问题就开始了: http://www.peterprovost.org/blog/2012/06
总的来说,我是 IOC 的新手,我有点难以理解我正在尝试做的事情是否有意义。我有一个 Web 表单应用程序,我想在其中创建一个模块来为我定义一些绑定(bind)。这些绑定(bind)将用于将存储库注入
调用container.Release时没有触发事件,下面的测试总是失败: public void ComponentDestroyedEvent() { var wasDestroyed = f
我经常使用并喜欢 Ninject。 我想知道为什么没有"BasicKernel"在 Ninject.Portable 中? 实现 IKernel 是否需要任何 PCL 不包含的调用? 我说的是简单场景
我目前正在学习 Ninject 和依赖项注入(inject),在我当前的设置中,我将 IKernel 传递到一些地方,以便其他类可以实例化某些类或获取工厂实例。 目前我已经将我的工厂绑定(bind)为
我想在不使用 new 的情况下注入(inject) AuthenticationService: IAuthenticationService authenticationService = null
我是一名优秀的程序员,十分优秀!