2010-11-01 34 views
10

Tôi sử dụng Castle Windsor làm IoC container của mình. Tôi có một ứng dụng có cấu trúc tương tự như sau:Castle Windsor: Tự động đăng ký các loại từ một hội đồng thực hiện giao diện từ một số khác

  • MyApp.Services.dll
    • IEmployeeService
    • IContractHoursService
    • ...
  • MyApp.ServicesImpl.dll
    • EmployeeService : MyApp.Services.IEmployeeService
    • ContractHoursService : MyApp.Services.IContractHoursService
    • ...

tôi sử dụng XML configuration vào lúc này, và mỗi khi tôi thêm một IService cặp/Dịch vụ mới, tôi có thêm một thành phần mới cho XML tập tin cấu hình. Tôi muốn chuyển tất cả điều này sang số fluent registration API nhưng chưa thực hiện được chính xác công thức phù hợp để làm những gì tôi muốn.

Có ai giúp được không? Lối sống sẽ là singleton.

Rất cám ơn trước.

Trả lời

12

Với AllTypes bạn có thể dễ dàng làm điều này:

Từ http://stw.castleproject.org/(S(nppam045y0sdncmbazr1ob55))/Windsor.Registering-components-by-conventions.ashx:

linh kiện Đăng ký một-by-one có thể là công việc lặp đi lặp lại. Ngoài ra việc ghi nhớ để đăng ký từng loại mới bạn thêm có thể nhanh chóng dẫn đến thất vọng. May mắn thay, bạn không phải làm điều đó, ít nhất là luôn luôn. Bằng cách sử dụng lớp nhập AllTypes, bạn có thể thực hiện đăng ký nhóm các loại dựa trên một số đặc điểm được chỉ định mà bạn chỉ định.

Tôi nghĩ đăng ký của bạn sẽ trông như thế:

AllTypes.FromAssembly(typeof(EmployeeService).Assembly) 
    .BasedOn<IEmployeeService>() 
    .LifeStyle.Singleton 

Nếu bạn thực hiện một loại hình cơ bản, như IService trên giao diện, bạn có thể đăng ký chúng cùng một lúc bằng cách sử dụng cấu trúc sau:

AllTypes.FromAssembly(typeof(EmployeeService).Assembly) 
    .BasedOn<IService>() 
    .WithService.FromInterface() 
    .LifeStyle.Singleton 

Để biết thêm ví dụ, hãy xem bài viết. Điều này có một mô tả rất tốt về khả năng là gì.

+0

Điều này không làm 100% những gì tôi cần. Có các giao diện dịch vụ khác nhau trong assembly đầu tiên, và tôi có một ánh xạ một-một với một cá thể cụ thể. Tôi sẽ phải viết mã trên và hơn một lần nữa như tôi làm cho cấu hình xml bây giờ. –

+0

Có một tùy chọn để có giao diện cơ sở cho 'IEmployeeService' không? Đó là những gì tôi đã làm. Bạn có thể yêu cầu Windsor tìm giao diện đó, đăng ký mọi thứ bên dưới nó (như vậy, đặc biệt là 'IEmployeeService') với các triển khai từ assembly. Mở rộng câu trả lời bằng một ví dụ. –

+0

Bạn có nghĩa là có một 'IService' đơn giản không có thành viên nào hoạt động như một giao diện điểm đánh dấu? Điều đó có thể làm việc, tôi chỉ hy vọng tôi có thể tránh được nó. :) –

3

tôi mất Pieter's answer về phía trước một chút (hữu thể chủ chốt, như ông đề nghị, AllTypes) và đã đưa ra với điều này:

// Windsor 2.x 
container.Register(
    AllTypes.FromAssemblyNamed("MyApp.ServicesImpl") 
    .Where(type => type.IsPublic) 
    .WithService.FirstInterface() 
    ); 

này đi qua tất cả các lớp học nào trong lắp ráp MyApp.ServicesImpl.dll và đăng ký mỗi trong vùng chứa bằng giao diện đầu tiên mà nó triển khai. Bởi vì tôi muốn tất cả các lớp trong hội đồng dịch vụ, tôi không cần giao diện điểm đánh dấu.

Các công trình trên cho phiên bản cũ của Windsor. Hiện tại Castle Windsor documentation for registering components cho phiên bản mới nhất gợi ý những điều sau đây:

// Windsor latest 
container.Register(
    AllTypes.FromAssemblyNamed("MyApp.ServicesImpl") 
    .Where(type => type.IsPublic) // Filtering on public isn't really necessary (see comments) but you could put additional filtering here 
    .WithService.DefaultInterface() 
    ); 
+0

bạn không cần 'Ở đâu (loại => loại .IsPublic) '. Windsor sẽ chỉ quét các loại được xuất (có nghĩa là công khai hoặc lồng nhau) theo mặc định. –

+0

Tôi nghĩ vậy, nhưng tôi nghĩ bạn cần 'Ở đâu (cái gì đó) 'mặc dù vì phương thức' WithService' không có giá trị trả về của 'FromAssemblyNamed()'. Oh, trừ khi tôi có một #intellisensefail ... Tôi sẽ kiểm tra ... –

+0

Tôi vừa kiểm tra, nó chắc chắn không biên dịch cho tôi. Vì tôi hiện đang sử dụng phiên bản cũ hơn của Windsor, tôi sẽ giả định rằng nó đã được cập nhật, và cập nhật câu trả lời ở trên liên quan đến Windsor mới nhất. Cảm ơn rất nhiều về đầu vào. :) –

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