Структура карты 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... но, опять же, вы можете увеличить его. Обратите внимание, что в конечном итоге вам понадобится параметр типа.

Другие вопросы по тегам