Я использую 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
не определен на уровне класса.Насколько я вижу, есть только два решения:
- Измените свойство
Manager
на метод и вызовите так: .Manager<IManager>()
- Добавьте универсальный
IManager
введите в класс и каким-то образом вставьте тип в метод разрешения Unity , хотя интерфейс разрешения не является универсальным ?
Вопрос:
Относительно 1: Почему невозможно указать универсальные типы для свойств?
Относительно 2: Можно ли указать конкретный тип в методе разрешения или конфигурация , хотя интерфейс не является универсальным?