Ninject中的ObjectFactory.GetInstance<>()如何工作?

时间:2014-12-16 04:08:57

标签: c# asp.net-mvc-4 ninject

在我的一个旧项目中重构代码时,我遇到了使用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但无法找到任何帮助。有人可以帮助我理解或指向资源。

2 个答案:

答案 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() methodexamplar 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