istanze denominate StructureMap Aperto Generico
-
27-09-2019 - |
Domanda
Devo fare quanto segue:
var someType = ObjectFactory.GetNamedInstance("myNamedInstance");
dove sometype può essere qualsiasi implementazione di ICommand.
così ho registrato alcuni di loro:
For(typeof(ICommand<>)).Use(typeof(Command1)).Named("myNamedInstance1");
For(typeof(ICommand<>)).Use(typeof(Command2)).Named("myNamedInstance2");
c'è un modo per fare questo in StructureMap, perché GetNamedInstance richiede il parametro tipo che io don3t so fino a runtime?.
Soluzione
(Per questo, sto assumendo si ICommand<T>
creato)
Questo in realtà non ha alcun senso ... pensa della linea:
//where aString is either myNamedInstance1 or myNamedInstance2
var someType = ObjectFactory.GetNamedInstance(aString);
Ora per scontato che non si ha intenzione di utilizzare var
, e invece il tipo effettivo. Che cosa mettere lì che potrebbe compilare? Vale a dire, che tipo può sometype eventualmente essere diversa object
?
Inoltre, ricorda che ICommand<string>
e ICommand<int>
sono entrambi i tipi di ICommand<T>
costruito, ma non sono altrimenti connesso -. Non hanno alcun tipo di base comune diverso da object
Se non il tipo fino al runtime, i generici non stanno andando per aiutare un gruppo - invece rendere la vostra eredita ICommand<T>
da qualche un'interfaccia comune - come ICommandBase
-. Che ha i metodi che realmente avete bisogno
Tuttavia, se proprio non si conosce il tipo di in quel metodo , si può spingere l'ignoto "up" nella compilazione, rendendo il metodo contenente tale generico:
public void Execute<T>( string commandName)
{
var someType = ObjectFactory.GetNamedInstance<ICommand<T>>(commandName);
someType.Execute();
}
Ora il chiamante di eseguire esigenze del tipo param ... ma ancora una volta si poteva spingere che fino. Si noti che alla fine è necessario il parametro di tipo.