gpt4 book ai didi

c# - 在 Ninject 中是否允许将 IKernel 注入(inject)到一些地方?

转载 作者:行者123 更新时间:2023-11-30 15:36:21 24 4
gpt4 key购买 nike

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

目前我已经将我的工厂绑定(bind)为单例,并将 IKernel 传递给一个对象然后执行 _kernel.Get<ISomethingFactory>().CreateSomething()看起来它可能有点代码味道,只是将 Ninject 变成了一个美化的服务定位器。

此外,我的工厂正在传递 IKernel,因此它们可以解析它们创建的相应接口(interface)的绑定(bind)实现。

我的问题是:

  1. 是否允许工厂以这种方式运行,或者工厂应该简单地实例化具体类型本身?

  2. 我应该赞成通过构造函数传递工厂/其他服务,而不是到处传递 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com