Instâncias nomeadas abertas do StructureMap Open
-
27-09-2019 - |
Pergunta
Devo fazer o seguinte:
var someType = ObjectFactory.GetNamedInstance("myNamedInstance");
onde algum tipo pode ser qualquer implementação do ICommand.
Então eu registrei alguns deles:
For(typeof(ICommand<>)).Use(typeof(Command1)).Named("myNamedInstance1");
For(typeof(ICommand<>)).Use(typeof(Command2)).Named("myNamedInstance2");
Existe uma maneira de fazer isso no StructureMap, porque o GetNamedInstance requer o parâmetro de tipo que eu não conheço até o tempo de execução.
Solução
(Para isso, estou assumindo vocês criada ICommand<T>
)
Na verdade, isso não faz sentido ... pense na linha:
//where aString is either myNamedInstance1 or myNamedInstance2
var someType = ObjectFactory.GetNamedInstance(aString);
Agora suponha que você não vai usar var
, e, em vez disso, o tipo real. O que você colocaria lá que poderia compilar? Isto é, que tipo pode algum tipo pode ser outro que não object
?
Além disso, lembre -se disso ICommand<string>
e ICommand<int>
ambos são tipos construídos de ICommand<T>
, mas não estão relacionados de outra forma - eles não têm nenhum tipo de base comum senão object
.
Se você não tiver do tipo até o tempo de execução, os genéricos não vão ajudar um monte - em vez disso, faça o seu ICommand<T>
herdar de alguma interface comum - como ICommandBase
- Isso tem os métodos que você realmente precisa.
No entanto, se você simplesmente não sabe o tipo nesse método, você pode empurrar o desconhecido "para cima" na compilação, fazendo o método que contém esse genérico:
public void Execute<T>( string commandName)
{
var someType = ObjectFactory.GetNamedInstance<ICommand<T>>(commandName);
someType.Execute();
}
Agora, o chamador do Execute precisa do tipo param ... mas, novamente, você pode empurrar isso para cima. Observe que, eventualmente, você precisará do parâmetro de tipo.