Einheit registrieren generischen Typ für nicht generische Schnittstelle
mein Szenario sieht (für mich) sehr geradlinig, aber ich konnte nicht eine Lösung finden.
Habe ich dieses Szenario
public class Class<T> : IInterface where T : class
{
}
die Schnittstelle kann nicht hergestellt werden generische (kommt vom WCF lib.)
so, ich möchte registrieren die Schnittstelle wie diese
container.RegisterType(typeof (IInterface ), typeof (Class<>));
und löst diese dann mit T
Wie kann ich es tun? Was bin ich?
meine Absicht ist, etwas zu tun, wie
container.Resolve<IInterface>(/* specify T */);
- Müssen Sie einen Typ angeben, der in die Klasse<> um typeof, um richtig zu arbeiten, vermutlich Sie werfen wollte, IInterface, um eine bestimmte Art von Klasse<T>, z.B. Klasse<Der> ?
- Nein, ich wollte nicht - ich wollte um diese Schnittstelle zu implementieren, die in einer generischen Art und Weise und ich brauche das T dynamisch zu sein.
- Wie würden Sie diese umsetzen, wenn Sie nicht mit der Einheit? Bitte aktualisieren Sie Ihre Frage mit dem code, dass diese shows. Hoffentlich ermöglicht es uns, besser zu verstehen, was es ist Sie versuchen zu erreichen.
- wenn ich nicht mit unity würde ich die Fabrik, die Sie vorgeschlagen. aber ich denke, dass die Einheit kann damit umgehen, da ich möchte, ihm zu sagen, was ist T, wenn ich die Lösung der Instanz.
- Man kann nicht sagen, diese Einheit, und man sollte nicht sagen, diese Einheit. Dies ist, wo das factory-pattern entworfen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie nicht müssen zu beheben, verwenden Sie die unkontrollierte Schnittstelle, können Sie Ihre eigene kontrollierte Schnittstelle, die verwendet Generika und leitet sich aus der unkontrollierten Schnittstelle. Dann können Sie sich registrieren und die offene, generische und lösen die geschlossenen generischen Typen.
Ihnen fehlt eine Fabrik.
Denken, es gibt keine Magie, Kobolde arbeiten auf dem hintergrund zu erraten, die Art, die Sie benötigen. Sie müssen es versorgen. Entweder, indem Sie explizit sagen, was
T
ist bei der Konfiguration so:Oder durch die Schaffung einer Fabrik, wo Sie passieren auf der
T
zur Laufzeit:Die Fabrik kann wie folgt registriert werden:
Sowie einer Implementierung kann wie folgt Aussehen:
Jetzt können Sie Spritzen den
IInterfaceFactory
in die Verbraucher, die Notwendigkeit, die Arbeit mitIInterface
und Sie können auf Anfrage die version, die Sie benötigen, durch aufrufen derCreate<T>()
Methode.UPDATE
Wenn Sie denken, das ist zu viel code, Sie können sich auch registrieren Sie einen factory-delegate wie folgt:
Dies ist im Grunde das gleiche, aber jetzt eingebettet in ein Delegierter. Die Verbraucher können sich nun darauf verlassen, eine
Func<Type, IInterface>
statt einerIInterfaceFactory
und geben Sie eine Typ-Instanz auf, um den Delegierten.Ich persönlich bevorzuge die Verwendung eines beschreibenden Schnittstelle wie
IInterfaceFactory
. Es ist bis zu Ihnen.