2012-05-25 14 views
12

Jesteśmy w trakcie przeprojektowywania niektórych starszych programów, aby były bardziej testowalne i zdecydowały się na Dependency-Injection i Castle.Windsor, aby nam pomóc.Wiele wzorów dekoratorów w zamku-windsor

Po pierwsze, nasz cel: * Liczba dekoratorów, które działają w strumieniu danych. * Możliwe są różne kombinacje dekoratorów, a węzły główne w każdym przypadku mogą być wymagane do uzyskania danych z różnych miejsc.

Technicznie, nasz projekt jest następujący:

interface IUpdateableValue<T> 
{ 
    T Get(); 
}; 

Mamy na przykład trzy zestawy danych, które należy pobrać z szeregu komponentów, wszystkie wdrożenia IUpdateableValue() (Pseudo-kod):

JsonParser(
    Decompressor(
     Decrypter(decryptionKey 
      FileCache(filename, 
       HttpWebDownloader(url)))) 

XmlParser(
    Decompressor(
     Decrypter(decryptionKey2 
      FileCache(filename2, 
       HttpWebDownloader(url2)))) 

Mam problemy wychodzi projekt, aby pasowały do ​​DI-ram jak zamek Windsor . Podejrzewam, że niektóre z nich mogą być obsługiwane przez nazwane instancje, ale wydaje się to śmierdzące dla tego użycia.

Chodzi o to, że "użytkownik" np. instancje JsonParser i XmlParser nie wiedzą (lub nie obchodzą), czy dane pochodzą z HttpUrl, pliku czy magicznie wyciągniętego z czapki.

Myślę, że coś jest nie tak z naszym projektem, ale nie wiemy, jak to naprawić.

Wszelkie pomysły na temat postępu?

+0

Są tu pytania dotyczące pracy z generycznymi dekoratorami w Windsor na stronie SO (na przykład [this one] (http://stackoverflow.com/questions/9888019)), ale nie pamiętam, aby ktoś na nie odpowiedział, więc Spodziewam się, że trudno to zrobić z Windsor. Inne pojemniki, takie jak Autofac lub Simple Injector, mogą przynieść więcej sukcesów. Być może [ta strona wiki dotycząca rejestrowania generycznych dekoratorów] (http://simpleinjector.codeplex.com/wikipage?title=Advanced-scenarios#Generic_Decorators) w Simple Injector może dać ci kilka pomysłów na temat projektowania twojego systemu. – Steven

+1

Dlaczego używałbyś do tego zamku? Jakie korzyści zapewni to? –

Odpowiedz

13

Z Castle Windsor można domyślnie skonfigurować decoraters, rejestrując je we właściwej kolejności. Musisz się zarejestrować zewnętrzną decorater pierwszy:

container.Register(Component 
    .For<IUpdateableValue>() 
    .ImplementedBy<JsonParser>()); 
container.Register(Component 
    .For<IUpdateableValue>() 
    .ImplementedBy<Decompressor>()); 
container.Register(Component 
    .For<IUpdateableValue>() 
    .ImplementedBy<Decrypter>()); 
... 

Kiedy rozwiązać IUpdateableValue Kasta Windsor automatycznie drut zależności, więc są one prawidłowo zagnieżdżone.

+4

Na marginesie: Jest "IsDefault", który poleca windsor, aby domyślnie rozpoznał konkretny komponent. Kolejność rejestracji nie ma znaczenia. – ChrisWue