在我的一个旧项目中重构代码时,我遇到了使用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
但无法找到任何帮助。有人可以帮助我理解或指向资源。
答案 0 :(得分:1)
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();
另见Looking for Ninject equivalent of StructureMap's ObjectFactory.GetInstance() method 和examplar ObjectFactory.cs implementation
答案 1 :(得分:0)
为了使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
更多信息here