Это упрощенная версия проблемы, с которой я сталкиваюсь.
Допустим, мое приложение содержит несколько реализаций "машины".У каждого автомобиля есть соответствующая модель вида, используемая для редактирования деталей автомобиля, что-то вроде этого:
public class Ford : ICar
{
}
public interface IEditorVm<TCar>
where TCar : ICar
{
}
public class FordEditor : IEditorVm<Ford>
{
}
Предположим, что я регистрирую все классы с использованием Castle Windsor следующим образом:
container.Register(
Classes.FromThisAssembly()
.BasedOn(typeof(ICar))
.WithServiceFirstInterface());
container.Register(
Classes.FromThisAssembly()
.BasedOn(typeof(IEditorVm<>))
.WithServiceFirstInterface());
Наконец, появится пользовательский интерфейс, который отображает список автомобилей (которые я могу залить, используя ICar[]
).
Когда пользователь выбирает автомобиль, я хочу разрешить соответствующую виртуальную машину, но единственные примеры разрешения обобщенных типов, которые я видел, включают указание типа (например, var vm = container.Resolve<IEditorVm<Ford>>();
).
Просмотрза предложения о том, как этого добиться.Конечно, я мог бы слишком стараться решить эту проблему, используя Виндзор, когда другой дизайн мог бы обеспечить более подходящее решение ...