Как работает ObjectFactory.GetInstance‹›() в 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>();

Я попытался найти в Google, что делает ObjectFactory.GetInstance, но не смог найти никакой помощи. Может ли кто-нибудь помочь мне понять или указать на ресурс.


person Yasser Shaikh    schedule 16.12.2014    source источник


Ответы (2)


ObjectFactory — это статический класс StructureMap (хорошо, могут быть и другие контейнеры внедрения зависимостей с типами с одинаковыми именами..). Ninject не содержит ObjectFactory. Таким образом, либо вы используете не Ninject, а другой контейнер DI, либо вы используете Ninject, но тогда вам придется искать ObjectFactory в своей собственной кодовой базе или в сторонней dll.

За кулисами этот вызов должен быть переведен на что-то вроде:

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() и пример реализации ObjectFactory.cs

person BatteryBackupUnit    schedule 16.12.2014

Чтобы 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

Подробнее здесь

person Jayden Meyer    schedule 16.12.2014