Настройте Unity для Inherted Interfaces - PullRequest
1 голос
/ 10 марта 2010

Я довольно новичок в Unity (ну, в общем, IoC и DI), и у меня возникают проблемы с его настройкой.

У меня есть два интерфейса:

public interface ISample { ... }

и

public interface IDerivedSample : ISample { ... }

и ряд классов бетонирования:

public class UseSample : IDerivedSample { ... }

Я пытаюсь настроить Unity для разрешения этих проблем при использовании следующим образом:

public class UsesSample
{
    private ISample _sample;

    public UsesSample(ISample sample) 
    {
        _sample = sample;
    }
}

Мои попытки настроить это не удаются, поэтому я подумал, что спрошу толпу, как это сделать.

EDIT

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

ISample = contianer.Resolve<ISample>("derived");

Однако, это терпит неудачу.

1 Ответ

1 голос
/ 10 марта 2010

Краткий ответ

container.RegisterType<ISample, UseSample>();

Более длинный ответ

Приведенный выше код работает, если вы регистрируете one , сопоставляя ISample конкретному классу. Когда я читаю ваш вопрос, у вас есть много реализаций ISample, и в этом случае двусмысленность возникает потому, что UsesSample не дает подсказки о том, как выбрать правильный ISample экземпляр .

Есть несколько выходов из такой головоломки. Некоторые из них относятся к DI-контейнеру (в данном случае Unity), в то время как другие решают проблему, создавая менее двусмысленный дизайн API.

Вы можете, например, использовать Abstract Factory для выбора зависимости на основе значения времени выполнения .

...