2013-03-07 24 views
7

Mam następujący problem: Mam zestaw silników, które automatycznie (nasłuchiwanie zdarzeń) kontrolują mój model. Poniższy rysunek przedstawia w ogólnym schemacie Klasa: Class DiagrammIdentyfikacja implementacji klasy bazowej w tablicy

Teraz mam klienta, który zna EngineFacade i chcę ustawić właściwość aktywny od Engine2 od klienta, ale ani klient, ani EngineFacade wie, które z trzy silniki to Engine2.

Istnieją dwa sposoby, ale nie lubię żadnego z nich:

  1. Sprawdź, czy jeden z silników jest typu Engine2 - jeśli istnieje inna klasa, która robi to samo zadanie, ale jest nazwany inny mam aby zmienić go w EngineBuilder AND w EngineFacade.
  2. Sprawdź za pomocą łańcucha identyfikacyjnego - naprawdę nie lubię magicznych ciągów.

Co wiem na stronie klienta jest to, że istnieje lub powinien być silnik, który obsługuje sieć. Ale nie wiem więcej.

Może muszę wybrać między dwoma diabłami, ale może jeden z was ma lepsze rozwiązanie.

+1

Jeśli musisz zidentyfikować każdy silnik osobno, łatwą opcją jest nadanie mu unikalnego identyfikatora. Innym sposobem na to jest posiadanie właściwości name na silniku bazowym. Każdy silnik implementuje właściwość name, a następnie uruchamia zdarzenie, a następnie sprawdza parametr nadawcy. –

+3

Być może powinieneś zbadać abstrakcję dostarczoną przez elewację. Wygląda na to, że masz jakiś wyciek. –

+0

Możesz chcieć uwzględnić klienta, jego metody i zmienne w diagramie lub napisać kod ilustrujący użycie. –

Odpowiedz

1

Można użyć atrybutu na realizację Engine2, tak:

[AttributeUsage(AttributeTargets.Class)] 
public class HandlesGridAttribute : Attribute { } 

które następnie stosuje się do wyprowadzenia:

[HandlesGrid] 
public Engine2 : EngineBase { ... } 

Następnie w kliencie, sprawdź atrybutu :

IEnumerable<EngineBase> bases = ...; 

// Get all the implementations which handle the grid. 
IEnumerable<EngineBase> handlesGrid = bases. 
    Where(b => b.GetType(). 
     GetCustomAttributes(typeof(HandlesGridAttribute), true).Any()); 

// Set the active property. 
foreach (EngineBase b in handlesGrid) b.Active = true; 

Główna wada (tutaj może, ale nie musi dotyczyć Ciebie) u) jest to, że nie można zmienić wartości w czasie wykonywania (ponieważ atrybut jest wypiekany w czasie kompilacji). Jeśli twój silnik nie jest dynamiczny w ten sposób, to atrybut jest właściwą drogą.

Jeśli chcesz zmienić to, czy wyprowadzenie może wykonać to działanie w czasie wykonywania, musisz powrócić do drugiej opcji, konstruując kod identyfikujący atrybuty silnika. Pamiętaj, że nie musi to być ciąg (i ja też tego nie lubię), ale może to być coś bardziej uporządkowanego, co da ci informacje, których szukasz.

+0

Thx, to było to, czego szukałem. Muszę tylko sprawdzić, jak jest to wykonawca. – Yggdrasil

+0

Wygląda na to, że nie jest tak drogi. Na wszelki wypadek zatrzymam się na tym silniku, w którym go używam. – Yggdrasil

Powiązane problemy