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?

War es hilfreich?

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)];
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top