Как разрешить конкретный неабстрактный экземпляр класса - PullRequest
0 голосов
/ 25 апреля 2018

У меня следующая проблема. У меня есть абстрактный базовый тип и конкретный подтип

    public interface IInterface
    {
        void SomeAction()
    }

    public class CClass : IInterface
    {
        public void SomeAction()
        {
            throw new NotImplementedException();
        }
    }

Я хотел бы разрешить зависимости интерфейса с помощью фабричного метода, но иногда я хотел бы разрешить конкретные зависимости класса без фабричного метода. Я имею в виду:

    container.RegisterType<IInterface, CClass>(new InjectionFactory(FactoryMethod));

Мой фабричный метод:

    private object FactoryMethod(IUnityContainer arg)
    {
        /* do some specific logic */
        return new CClass();
    } 

Иногда я хотел бы разрешить это, используя фабричный метод:

var c1 = container.Resolve<IInterface>();

Но иногда я хотел бы восстановить его без вызова FactoryMethod

var c2 = container.Resolve<CClass>();

Но FactoryMethod вызывается во всех отношениях. Зачем? Что случилось? Я хочу использовать фабричный метод для абстрактных зависимостей только

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Чтобы разрешить конкретный класс, вам не нужно его регистрировать.Unity попытается создать экземпляр.

Чтобы разрешить интерфейс, используя фабричный метод, вам нужно зарегистрировать только интерфейс, как показано в вашем ответе:

container.RegisterType<IInterface>(new InjectionFactory(FactoryMethod));

И здесь нет плохой практики

Кстати, ваша первоначальная регистрация интерфейса container.RegisterType<IInterface, CClass>(new InjectionFactory(FactoryMethod)) дает мне System.InvalidOperationException.Как бы то ни было, я не вижу смысла указывать второй универсальный параметр в этом случае.

0 голосов
/ 25 апреля 2018

Я нашел решение, но я не уверен, что это лучшие практики.Если я не буду писать конкретный тип общего параметра типа TTo, он будет работать нормально.

...