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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top