Unity 2.1 - Разрешить универсальный тип из неуниверсального интерфейса? - PullRequest
0 голосов
/ 28 марта 2012

Я использую Unity (принудительно настраивается через конфигурационный файл), и я как бы застрял прямо сейчас.Вопрос довольно длинный, вы можете перейти к сценарию, проблеме и вопросу , конфигурации / коду для справки.

Помощь очень важна!

Конфигурация:

<register type="IService" mapTo="DefaultService" name="Context1" />
<register type="IService" mapTo="ExtendedService" name="Context2" />

<register type="IManager" mapTo="DefaultManager" name="Context1" />
<register type="IManager" mapTo="ExtendedManager" name="Context1" />

Код :

public interface IService 
{
    void DoSomething();
}

public class DefaultService : IService 
{
    protected IManager Manager { 
        return Container.Resolve<IManager>(ContextBasedName());
    }

    public void DoSomething() {
        Manager.DoSomething();
    }
}

public class ExtendedService : DefaultService 
{

}

public interface IManager  
{
    void DoSomething();
}

public class DefaultManager : IManager 
{
    protected virtual void DoSomething() 
    {
        //Do something default
    }
}

public class ExtendedManager : DefaultManager
{
    protected override void DoSomething() 
    {
        //First do something special

        base.DoSomething(); //then the default
    }
}

Сценарий :

У меня два контекст , в котором разрешены типы IService ( Context1 и Context2 ).ContextBasedName() вернет правильную строку для фактического контекста.

Внутри Context1 :

//Will return DefaultService
var service = Container.Resolve<IService>(ContextBasedName());

service.DoSomething(); //Will eventually call DefaultManager.DoSomething();

Внутри Context2 :

//Will return ExtendedService
var service = Container.Resolve<IService>(ContextBasedName()); 

service.DoSomething(); //Will eventually call ExtendedManager.DoSomething();

Проблема:

Сценарий, описанный выше, подойдет, однако проблема связана с кодом , который не компилируется .Он не компилируется из-за определения свойства Manager в классе DefaultService:

protected IManager Manager { 
    return Container.Resolve<IManager>(ContextBasedName());
}

Универсальный тип IManager не определен на уровне класса.Насколько я вижу, есть только два решения:

  1. Измените свойство Manager на метод и вызовите так: .Manager<IManager>()
  2. Добавьте универсальный IManagerвведите в класс и каким-то образом вставьте тип в метод разрешения Unity , хотя интерфейс разрешения не является универсальным ?

Вопрос:

Относительно 1: Почему невозможно указать универсальные типы для свойств?

Относительно 2: Можно ли указать конкретный тип в методе разрешения или конфигурация , хотя интерфейс не является универсальным?

1 Ответ

1 голос
/ 28 марта 2012

Почему вы не используете внедрение конструктора и не настраиваете внедрение правильного менеджера для каждой службы?

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


Обновление

Если необходимо указать значения времени выполнения, введите фабрику для менеджера вместо экземпляра менеджера.

...