Wie kann ich diese einfache Arbeit C # Generika-Fabrik machen?
Frage
Ich habe diesen Entwurf:
public interface IFactory<T> {
T Create();
T CreateWithSensibleDefaults();
}
public class AppleFactory : IFactory<Apple> { ... }
public class BananaFactory : IFactory<Banana> { ... }
// ...
Die fiktive Apple
und Banana
hier müssen keine gemeinsamen Typen teilen (außer object
, natürlich).
Ich habe keine Kunden wollen auf bestimmte Fabriken müssen abhängen, so stattdessen kannst du fragen, um nur FactoryManager
für einen neuen Typ. Es hat eine FactoryForType
Methode:
IFactory<T> FactoryForType<T>();
Nun können Sie die entsprechenden Interface-Methoden mit so etwas wie FactoryForType<Apple>().Create()
aufrufen. So weit, so gut.
Aber es gibt ein Problem bei der Implementierungsebene: Wie ich diese Zuordnung von Typen IFactory<T>
s speichern Sie? Die naive Antwort ist ein IDictionary<Type, IFactory<T>>
, aber das funktioniert nicht, da es auf der T
kein Typ Kovarianz ist (ich bin mit C # 3.5). Bin ich nur mit einem IDictionary<Type, object>
stecken und dabei das Gießen von Hand?
Lösung
Leider sind ja Sie mit dem manuellen Gießen stecken. Dies kann jedoch Gießen eine Implementierung Detail und nicht vom Verbraucher gesehen. Zum Beispiel
public class FactoryMap {
private Dictionary<Type,object> _map = new Dictionary<Type,object>();
public void Add<T>(IFactory<T> factory) {
_map[typeof(T)] = factory;
}
public IFactory<T> Get<T>() {
return (IFactory<T>)_map[typeof(T)];
}
}