2012-05-25 33 views
12

Chúng tôi đang trong quá trình thiết kế lại một số phần mềm kế thừa để có thể thử nghiệm hơn và đã quyết định khi Dependency-Injection và Castle.Windsor giúp chúng tôi.Nhiều kiểu trang trí trong castle-windsor

Đầu tiên, mục tiêu của chúng tôi: * Một số trang trí tất cả đều hoạt động trên luồng dữ liệu. * Nhiều kết hợp của trang trí có thể và các nút gốc trong mỗi trường hợp có thể được yêu cầu để lấy dữ liệu từ các vị trí khác nhau.

Về mặt kỹ thuật, thiết kế của chúng tôi là như sau:

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

Chúng tôi có ví dụ ba bộ dữ liệu được lấy ra với một số thành phần, tất cả thực hiện IUpdateableValue() (Pseudo-code):

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

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

Tôi đang gặp sự cố khi nhận ra thiết kế để phù hợp với một DI-framework như Lâu đài Windsor- . Tôi nghi ngờ một số của nó có thể được xử lý bởi các trường hợp được đặt tên, nhưng điều này có vẻ mùi cho việc sử dụng này.

Ý tưởng là "người dùng" của ví dụ: các trường hợp JsonParser và XmlParser không biết (hoặc quan tâm) cho dù dữ liệu đến từ một HttpUrl, một tập tin hoặc kỳ diệu kéo ra khỏi một chiếc mũ.

Tôi nghĩ rằng có điều gì đó sai trong thiết kế của chúng tôi, nhưng không chắc chắn cách khắc phục.

Bất kỳ ý tưởng nào về cách tiến bộ?

+0

Có câu hỏi về cách làm việc với trang trí chung ở Windsor ở đây trên SO (chẳng hạn như [this one] (http://stackoverflow.com/questions/9888019)), nhưng tôi không thể nhớ bất kỳ ai được trả lời, vì vậy Tôi hy vọng điều này là khó khăn để làm với Windsor. Các thùng chứa khác, chẳng hạn như Autofac hoặc Simple Injector, có thể mang lại nhiều thành công hơn. Có lẽ [trang wiki này về việc đăng ký trang trí chung chung] (http://simpleinjector.codeplex.com/wikipage?title=Advanced-scenarios#Generic_Decorators) trong Simple Injector có thể cung cấp cho bạn một số ý tưởng về cách thiết kế hệ thống của bạn. – Steven

+1

Tại sao bạn sử dụng Lâu đài cho điều này? Nó sẽ cung cấp những lợi ích gì? –

Trả lời

13

Với Castle Windsor, bạn hoàn toàn có thể định cấu hình trang trí bằng cách đăng ký đúng thứ tự. Bạn cần phải đăng ký trang trí bên ngoài trước tiên:

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

Khi bạn giải quyết IUpdateableValue Caste Windsor sẽ tự động kết nối các phụ thuộc, vì vậy chúng được lồng đúng cách.

+4

Lưu ý: Có 'IsDefault' sẽ hướng dẫn windsor giải quyết một thành phần cụ thể theo mặc định. Sau đó, thứ tự đăng ký không quan trọng. – ChrisWue

Các vấn đề liên quan