2010-11-23 9 views
1

ich folgendes tun müssen:Structuremap öffnen Allgemein benannte Instanzen

var someType = ObjectFactory.GetNamedInstance("myNamedInstance"); 

wo sometype jede Implementierung von ICommand sein kann.

so registriert ich einige von ihnen:

For(typeof(ICommand<>)).Use(typeof(Command1)).Named("myNamedInstance1"); 
For(typeof(ICommand<>)).Use(typeof(Command2)).Named("myNamedInstance2"); 

ist es eine Möglichkeit, dies in StructureMap zu tun, weil GetNamedInstance den Typ-Parameter benötigt, die erst zur Laufzeit weiß ich don3t.?

Antwort

2

(Dazu gehe ich davon aus SieICommand<T> erstellt)

Das eigentlich keinen Sinn machen ... denken Sie an die Linie:

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

Nehmen wir nun an, dass Sie nicht verwenden var, und stattdessen der tatsächliche Typ. Was würdest du da einbauen, das kompilieren könnte? Das heißt, welchen Typ kann someType möglicherweise anders als object?

Denken Sie auch daran, dass ICommand<string> und ICommand<int> beide konstruierten Typen von ICommand<T> sind, aber sonst nicht verwandte - sie haben keinen gemeinsamen anderen Basistyp als object.

Wenn Sie nicht den Typ bis zur Laufzeit, Generika werden nicht helfen eine Reihe - stattdessen machen Sie Ihre ICommand<T> erben von einer gemeinsamen Schnittstelle - wie ICommandBase -, die die Methoden hat, die Sie tatsächlich benötigen.

Wenn Sie jedoch einfach nicht die Art wissen in dieser Methode, können Sie das Unbekannte drücken „nach oben“ in der Kompilierung durch die Methode machen enthält, dass generische:

public void Execute<T>(string commandName) 
{   
    var someType = ObjectFactory.GetNamedInstance<ICommand<T>>(commandName); 
    someType.Execute(); 
} 

nun der Anrufer von execute benötigt den type param ... aber wieder könntest du das nach oben schieben. Beachten Sie, dass Sie eventuell den Typparameter benötigen.

+0

danke für deine antwort – Luka