Tworzenie obiektów - pomysł na architekture - początkujący

0

Witam serdecznie.

Mam problem z odpowiednim zamodelowaniem klas. Jestem początkującym i wydaje mi się, że problem nie jest zbyt skomplikowany.

Mam klasy, które nie mają wspólnego rodzica, ale czasem jedna potrzebuje drugiej. Tych klas nie mogę zmienić.

Class A, Class B, Class C, Class D, ... // żadna klasa po niczym nie dziedziczy, są małe, nie robią dużo

W tych klasach czasem się coś niestety zmieni - np. konstruktor! Nie jest to zależne ode mnie, a mi wtedy zostaje poprawianie jednego z modułów, który zawiera powiedzmy 15 instancji klasy D. Do klasy D do ktoś dodaje konstruktor C, a konstrutor C wymaga B. Dla zobrazowania:

FooMethod()
{
 string x = "Example"; //czasem ten parametr może być domyślny, nie zawsze potrzebuję go ustawiać na coś własnego

 B objB = new B(x); 
 C objC = new C(B);
 D objD = new D(C);
 
 objD.Work();
}

Te konstruktory w rzeczywistości są bardziej złożone. Na chwilę obceną wymyśliłem coś takego:

FooMethod()
{
 string x = "Example";

 new DBuilder().WithStringParameter(x).Build().Work();
 //lub w przypadku kiedy mnie parametr nie interesuje:
 new DBuilder().Build().Work();
}

Klasa DBuilder ma mniej więcej tyle:

DBuilder
{
 private string parameter = "Example"; 
 public DBuilder WithStringParameter(string x) { //ustawiam paramter i return this; }
 public D Build() { tworzę obiekt CBuilderem i zwracam D}
}

Problem w tym jest taki, że teraz w każdym Builderów mam to samo:

  1. string x
  2. Metoda ustawiająca string i zwracająca siebie (DBuilder zwraca DBuilder, CBuilder zwraca CBuilder, ..., ABuilder zwraca ABuilder)
  3. Metoda tworząca obiekt, w każdej klasie inny (D, C, ..., A)

W jaki sposób to sprytnie rozwiązać? Może pojawić sie klasa, która nie będzie miała tego parametru w ogóle.

0

To może jakiś kontener IoC?

0

Contener IoC byłby dobrym wyjściem jak @somekind zasugerował.

Ewentualnie zrób jeden builder jeśli zawsze Tworzenie D wymaga takiego samego łańcuszka zależności. Albo zamiast Buildera zrób Fabrykę np prostą statyczną metodę której użyjesz

myDClass = DClassFactoryWithBadName.GetDClass(x); Gdzie już stworzysz sobie coś w stylu return new D(new C(new B (new A (x)))); Ale... kontener IoC właśnie to by załatwił i nie było by to robione na kolanie jak to rozwiązanie.

Edytka dodaje:
Tutaj masz prezentację jak to zrobić dobrze (i dlaczego warto) za pomocą ninjecta:
http://blog.agilistic.nl/a-step-by-step-guide-to-using-ninject-for-dependancy-injection-in-c-sharp/
CastleWindsor też mogę polecić, ale ten tutorial pierwszy wpadł mi w ręce. :)

0

Jeśli to co ja zrobiłem, jest protezą jakiegoś wzorca projektowego, to jest to przypadek. Ale macie rację, chyba powinienem użyć IoC.

1 użytkowników online, w tym zalogowanych: 0, gości: 1