Mam rozwiązanie w VS2010 z kilkoma projektami, z których każdy tworzy warstwę w mojej aplikacji. Mam encje biznesowe, które są obecnie obiektami bez metod, i mam warstwę zarządzania, która odwołuje się do warstwy encji biznesowych w swoim projekcie. Teraz wydaje mi się, że słabo zaprojektowałem moją aplikację i chciałbym przenieść metody z klas pomocniczych (które są w innej warstwie) do metod, które stworzę w samych jednostkach biznesowych.

Na przykład mam obiekt VirtualMachine, który używa klasy pomocniczej do wywołania na nim metody Reboot(), która przekazuje żądanie do warstwy zarządzania. Klasa menedżera statycznego komunikuje się z interfejsem API, który ponownie uruchamia maszynę wirtualną. Chcę przenieść metodę Reboot() do obiektu VirtualMachine, ale będę musiał odwołać się do warstwy zarządzania:

public void Reboot()
{  
    VMManager.Reboot(this.Name);
}

Więc jeśli dodam odwołanie do mojego projektu zarządzania w moim projekcie encji, otrzymuję błąd zależności cyklicznej, który powinien być. Jak mogę rozwiązać tę sytuację? Czy potrzebuję jeszcze jednej warstwy między warstwą encji a warstwą zarządzania? A może powinienem po prostu o tym zapomnieć i zostawić tak, jak jest.

Aplikacja działa teraz dobrze, ale obawiam się, że mój projekt nie jest szczególnie zorientowany na OOP i chciałbym to poprawić.

0
Tom Pickles 3 kwiecień 2012, 15:25

2 odpowiedzi

Najlepsza odpowiedź

Masz rację, nie powinieneś tworzyć odniesień cyklicznych, tworzenie kolejnej warstwy może po prostu pomóc w uniknięciu błędu odwołania cyklicznego, ale nadal będzie to odwołanie cykliczne, jeśli dobrze cię zrozumiałem.

Siadałbym, rysował mapę i metody powinny wywoływać TYLKO w warstwach. To są najbardziej ogólne metody na dole programu, a im bardziej wyspecjalizowane jesteś, tym wyżej w hierarchii powinieneś je umieścić.

Interfejs API programu, który tworzysz, powinien znajdować się na dole tej hierarchii.

Być może nie będziesz musiał przeprojektowywać całego projektu. Ale wygląda na to, że mógłbyś sobie pomóc w wizualizacji struktury.

1
Bjørn 3 kwiecień 2012, 15:34

Warstwa zarządzania (ponieważ to ona wykonuje pracę) nie wydaje się pasować do górnej warstwy biznesowej. I tak naprawdę nie mamy takiej warstwy nad warstwą Biznes, mamy tylko warstwę fasadową na górze warstwy Biznes - co nie jest tym, czego potrzebujesz.

Z tego co widzę w Twoim projekcie, potrzebujesz warstwy biznesowej, aby korzystać z usług klasy helper:

// Business layer
public class VirtualMachineManager
{
   IRebooter _rebooter;
   public class(IRebooter rebooter)
   {
      _rebooter = rebooter;
   }
}

// helper class
public class Rebooter : IRebooter 
{
   ....
}
0
Aliostad 3 kwiecień 2012, 15:32