Frage

Ich habe ein Problem zu verstehen, wie IoC in einem Szenario verwenden, wo ich Objekte dynamisch erstellen müssen. Nehmen wir an, ich diese Klassen haben:

abstract class Field {
  public Field( ICommandStack commandStack ) {}
}

abstract class Entity {
  public readonly Collection<Field> Fields { get; }
}

class EntityA {
  public EntityA( ICommandStack commandStack ) {
    Fields.Add( new StringField( commandStack ) );
  }
}

class EntitiyB {
  public EntityB( ICommandStack commandStack ) {
    Fields.Add( new IntField( commandStack ) );
    Fields.Add( new IntField( commandStack ) );
    Fields.Add( new IntField( commandStack ) );
  }
}

Also mein Problem ist die Schaffung von Feldern in der Konstrukteurs. Meine Felder benötigen einen ICommandStack, aber die Entities nicht. Sie erhalten nur die ICommandStack für die Erstellung ihrer Felder.

Es könnte einfacher sein, die Felder als Argument in jeder Einheit Konstruktor zu beantragen. Aber die Zahl der Felder könnte> 10 für einzelne Einheiten. Ich will nicht mit so vielen Parametern Konstrukteuren erstellen.

Also meine Idee war, eine FieldFactory zu den Entities zu übergeben:

class EntityA {
  public EntityA( IFieldFactory fieldFactory ) {
    // create as many fields as needed via the factory
    Fields.Add( fieldFactory.CreateStringField() );
  }
}

zumindest die (für Entity) unnötige ICommandStack jetzt weg. Aber wie schafft die FieldFactory ein Feld? Es kann nur bekommt die ICommandStack injizierten - sondern die Schaffung von Feldern hat noch über das ‚neue‘ Schlüsselwort zu tun. Oder soll ich gebe dem Werk einen Verweis auf meine DI-Container?

Was ist eine gute Design-Lösung hier?

War es hilfreich?

Lösung

würde ich eine FieldFactory verwenden und das Werk mit einem Verweis auf den Behälter (oder an eine Schnittstelle, die es abstrahiert, wenn Sie eine starke Abhängigkeit mit der Einnahme auf dem Behälter nicht zufrieden sind) zu injizieren.

Ansonsten ist es Schildkröten den ganzen Weg hinunter. Sie benötigen einen Gegenstand, den Behälter zu einem bestimmten Zeitpunkt für eine neue Instanz zu fragen. Wenn Sie Ihre Felder wollen DI-injiziert werden, dann müssen Sie den Behälter bitten, sie oder Sie zu bauen.

Um es zusammenzufassen, würde ich gehen mit der Fabrik.

Andere Tipps

Im Frühjahr (und Spring.NET) gibt es das Konzept eines „Prototyp-scoped“ bean / Objekt.

http: / /static.springframework.org/spring/docs/2.0.x/reference/beans.html#beans-factory-scopes-prototype

Anstatt feste Gegenstände injizieren und sie alle zusammen Verdrahtung, ein Prototyp Rahmen wird eine neue Instanz des Objekts zu jeder Zeit schaffen es aus dem IoC-Container angefordert wird. Ich bin mir nicht sicher, welche DI Rahmen Sie verwenden, aber es könnte etwas ähnliches haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top