2012-01-23 25 views
19

Sự hiểu biết hiện tại của tôi về đăng ký Castle Windsor là người ta chỉ có thể xác nhận đăng ký bằng cách gọi Resolve trên một thành phần gốc. Nhưng kể từ khi mô hình thành phần của windsor biết phụ thuộc của mỗi thành phần, nó sẽ có thể kiểm tra rằng tất cả các phụ thuộc có thể được hài lòng mà không thực sự instantiating bất cứ điều gì. Lý do chính để làm điều này là có một bài kiểm tra đơn vị đăng ký mà không yêu cầu tôi phải khai báo các thành phần gọi các tài nguyên bên ngoài khi khởi động.Castle Windsor: có cách xác thực đăng ký mà không có cuộc gọi giải quyết không?

Ví dụ: Tôi có một lớp Gốc có sự phụ thuộc vào IChild:

public class Root : IRoot 
{ 
    private IChild child; 

    public Root(IChild child) 
    { 
     this.child = child; 
    } 
} 

Nếu tôi đăng ký Gốc là IRoot, nhưng không đăng ký IChild. Khi tôi gọi quyết tâm như thế này:

var container = new WindsorContainer().Register(
    Component.For<IRoot>().ImplementedBy<Root>() 
    ); 

container.Resolve<IRoot>(); 

tôi nhận được một lỗi:

MyNamespace.Root is waiting for the following dependencies: 

Services: 
- MyNamespace.IChild which was not registered. 

Có cái gì đó như:

container.TestResolve<IRoot>(); 

Điều đó sẽ bước đi trên đồ thị phụ thuộc và kiểm tra xem tất cả phụ thuộc có thể được hài lòng, nhưng không thực sự khởi tạo bất cứ điều gì?

Trả lời

27

OK, có thể. Cảm ơn Krzysztof Koźmic đã chỉ cho tôi cách. Không rõ ràng ngay lập tức, nhưng bạn có thể sử dụng hệ thống con chẩn đoán của Windsor để tăng các vấn đề tiềm ẩn khi đăng ký. Tôi đã đặt cùng một chút phương pháp tĩnh ném nếu có bất kỳ thành phần cấu hình sai:

private static void CheckForPotentiallyMisconfiguredComponents(IWindsorContainer container) 
{ 
    var host = (IDiagnosticsHost)container.Kernel.GetSubSystem(SubSystemConstants.DiagnosticsKey); 
    var diagnostics = host.GetDiagnostic<IPotentiallyMisconfiguredComponentsDiagnostic>(); 

    var handlers = diagnostics.Inspect(); 

    if (handlers.Any()) 
    { 
     var message = new StringBuilder(); 
     var inspector = new DependencyInspector(message); 

     foreach (IExposeDependencyInfo handler in handlers) 
     { 
      handler.ObtainDependencyDetails(inspector); 
     } 

     throw new MisconfiguredComponentException(message.ToString()); 
    } 
} 

Bạn có thể sử dụng nó như thế này:

var container = new WindsorContainer().Register(
    Component.For<IRoot>().ImplementedBy<Root>() 
    ); 

CheckForPotentiallyMisconfiguredComponents(container); 

Trong trường hợp này tôi nhận được một MisconfiguredComponentException với tin nhắn này:

'WindsorSpikes.Root' is waiting for the following dependencies: 
- Service 'WindsorSpikes.IChild' which was not registered. 

WindsorSpikes.MisconfiguredComponentException: 
'WindsorSpikes.Root' is waiting for the following dependencies: 
- Service 'WindsorSpikes.IChild' which was not registered. 

Xem tài liệu lâu đài để biết thêm chi tiết về các hệ thống phụ chẩn đoán:

http://stw.castleproject.org/Default.aspx?Page=Debugger-views&NS=Windsor

+0

phương pháp thử nghiệm tốt đẹp :) – bevacqua

+1

mã này không còn biên dịch: Loại 'Castle.Windsor.Diagnostics.IPotentiallyMisconfiguredComponentsDiagnostic' không thể được sử dụng như loại tham số 'TDiagnostic' trong các loại generic hoặc phương pháp 'Castle.Windsor .Diagnostics.IDiagnosticsHost.GetDiagnostic () '. Không có chuyển đổi tham chiếu ngầm định từ 'Castle.Windsor.Diagnostics.IPotentiallyMisconfiguredComponentsDiagnostic' to 'Castle.Windsor.Diagnostics.IDiagnostic '. Bạn có biết cách khắc phục không? –

+0

Peri, mã biên dịch cho tôi, Castle 3.2 dưới .net 4 – samy

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