Структура карты Open Generic именованные экземпляры - PullRequest
1 голос
/ 23 ноября 2010

Я должен сделать следующее:

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 Ответ

2 голосов
/ 23 ноября 2010

(Для этого я предполагаю вы создали ICommand<T>)

Это на самом деле не имеет никакого смысла ... подумайте о строке:

//where aString is either myNamedInstance1 or myNamedInstance2
var someType = ObjectFactory.GetNamedInstance(aString);

Теперь предположим, что вы не собираетесь использовать var, а вместо этого фактический тип. Что бы вы положили туда, что можно скомпилировать? То есть, какой тип может иметь тип someType, отличный от 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 ... но, опять же, вы можете увеличить его. Обратите внимание, что в конечном итоге вам понадобится параметр типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...