Структура карты Open Generic именованные экземпляры
Я должен сделать следующее:
var someType = ObjectFactory.GetNamedInstance("myNamedInstance");
где someType может быть любой реализацией ICommand.
поэтому я зарегистрировал некоторые из них:
For(typeof(ICommand<>)).Use(typeof(Command1)).Named("myNamedInstance1");
For(typeof(ICommand<>)).Use(typeof(Command2)).Named("myNamedInstance2");
Есть ли способ сделать это в StructureMap, потому что GetNamedInstance требует параметр типа, который я не знаю до времени выполнения.
1 ответ
(Для этого я предполагаю, что вы создали ICommand<T>
)
Это на самом деле не имеет никакого смысла... думать о строке:
//where aString is either myNamedInstance1 or myNamedInstance2
var someType = ObjectFactory.GetNamedInstance(aString);
Теперь предположим, что вы не собираетесь использовать var
и вместо фактического типа. Что бы вы положили туда, что могло бы скомпилировать? То есть, какой тип может отличаться от object
?
Кроме того, помните, что ICommand<string>
а также ICommand<int>
оба построены типы из ICommand<T>
, но не связаны между собой - у них нет общего базового типа, кроме object
,
Если вы не печатаете до времени выполнения, генерики не помогут куче - вместо этого сделайте ICommand<T>
наследовать от какого-то общего интерфейса - как ICommandBase
- это методы, которые вам действительно нужны.
Однако, если вы просто не знаете тип в этом методе, вы можете нажать неизвестное "вверх" в компиляции, сделав метод, содержащий этот универсальный:
public void Execute<T>( string commandName)
{
var someType = ObjectFactory.GetNamedInstance<ICommand<T>>(commandName);
someType.Execute();
}
Теперь вызывающему исполнителю нужен тип param... но, опять же, вы можете увеличить его. Обратите внимание, что в конечном итоге вам понадобится параметр типа.