Ninject 中的 ObjectFactory.GetInstance<>() 是如何工作的
本文关键字:何工作 工作 中的 GetInstance Ninject ObjectFactory | 更新日期: 2023-09-27 18:34:16
在我的一个旧项目中重组代码时,我遇到了一个使用 DI 的静态类。下面是它的外观...
public static class AccountTypeHelper
{
private static readonly IAccountTypeProvider AccountTypeProvider;
static AccountTypeHelper()
{
AccountTypeProvider = ObjectFactory.GetInstance<IAccountTypeProvider>();
}
public static string AppName()
{
return AccountTypeProvider.GetAccountType().AppName;
}
}
好吧,一切都很好。工厂选择了正确的供应商,一切顺利。
但我试图理解这行代码是如何工作的。
AccountTypeProvider = ObjectFactory.GetInstance<IAccountTypeProvider>();
我试着在谷歌上搜索ObjectFactory.GetInstance
做什么,但找不到任何帮助。有人可以帮助我理解或指出资源吗?
ObjectFactory
是一个静态的StructureMap类(好吧,可能还有其他具有相同名称类型的DI容器)。Ninject没有ObjectFactory
。因此,要么你没有使用Ninject,而是使用不同的DI容器,要么你使用的是Ninject,但你必须在自己的代码库或第三方dll中寻找ObjectFactory
。
在幕后,此调用需要转换为以下内容:
public static class ObjectFactory
{
public static IKernel Kernel { get; internal set; }
public T GetInstance<T>()
{
return Kernel.Get<T>();
}
}
// somewhere initialization of static instance needs to be done:
ObjectFactory.Kernel = new StandardKernel();
另请参阅查找 Ninject 等效于 StructureMap 的 ObjectFactory.GetInstance() 方法和 examplar 对象工厂.cs实现
为了使 Ninject 正常工作,通常需要在调用 Get
或类似时告诉它要实例化哪个类。这是通过绑定一个类来完成的,该类使用类似于以下代码的内容实现接口
Bind<IAccountTypeProvider>().To<SomeAccountTypeProvider>();
从那时起,当您调用 Get<IAccountTypeProvider>()
时,它将返回一个新的SomeAccountTypeProvider
实例
编辑:忘了提到Ninject没有等同于StructureMaps ObjectFactory.GetInstance<IAccountTypeProvider>()
。您可以改用如下所示的内容
IKernel ninjectKernel = new StandardKernel();
ninjectKernel.Bind<IAccountTypeProvider>().To<SomeAccountTypeProvider>();
IAccountTypeProvider provider = ninjectKernel.Get<IAccountTypeProvider>();
//returns an instance of SomeAccountTypeProvider
更多信息在这里