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做什么,但找不到任何帮助。有人可以帮助我理解或指出资源吗?

Ninject 中的 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

更多信息在这里