2016-10-05 26 views
7

Nói ngắn gọn Tôi đang cố gắng liên kết các thùng chứa Castle Windsor với hộp chứa Unity. Hãy để tôi giải thích ngữ cảnh:Đường ống có độ phân giải của đường ống gió với Unity dưới dạng phân giải phụ

Tôi có một dự án trong đó thời gian rất dài nó sử dụng lâu đài windsor. Một vài ngày trước, tôi có một đống dll mà tôi phải tiêu thụ/sử dụng từ dự án cũ của tôi. Những DLL sử dụng Unity Container làm cơ chế tiêm của chúng. Tôi cũng có quyền truy cập vào các giao diện/triển khai được tìm thấy trong các dll này nhưng tôi sẽ không cố gắng để nhanh chóng triển khai thủ công nhưng tôi chỉ thích, nếu có thể, để liên kết container Unity với container windsor lâu đài hiện tại của tôi. Làm thế nào tôi có thể đạt được điều này?

Vì vậy, nếu tôi có:

public class MyService: IService 
{ 
    public MyService (IThidPartyService thirdParty) 
    { 

    } 
} 

Nếu tôi giải quyết IService với windsor nó sẽ được tốt đẹp mà IThirdPartyService để được giải quyết bằng container khác: Unity.

Cảm ơn bạn !.

Trả lời

4

Tôi nghĩ đây là ví dụ hoàn hảo cho việc sử dụng tùy chỉnh ISubDependencyResolver. Bất cứ khi nào Castle sẽ không biết cách giải quyết một sự phụ thuộc cụ thể, nó sẽ giải quyết giải quyết tùy chỉnh đó. Người quyết định mới sẽ phụ thuộc vào Container Thống nhất và sẽ sử dụng nó để giải quyết "cho" Lâu đài.

Castle's documentation khẳng định rằng:

Nếu nơi trước đó đã không thể giải quyết phụ thuộc resolver sẽ hỏi mỗi tiểu phân giải của nó (ISubDependencyResolver) nếu họ có thể cung cấp các phụ thuộc.

Vì vậy, khi phụ thuộc đó sẽ không được tìm thấy trong Castle, nó sẽ tìm kiếm người giải quyết mới của bạn sẽ cung cấp sự phụ thuộc.

Dưới đây là một ví dụ làm việc với cả hai Constructor tiêmtiêm tài sản:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var unityContainer = new UnityContainer(); 
     unityContainer.RegisterType<IDependency, Dependency1>(); 
     unityContainer.RegisterType<IPropertyDependency, PropertyDependency1>(); 

     WindsorContainer castleContainer = new WindsorContainer(); 
     castleContainer.Kernel.Resolver.AddSubResolver(new UnityResolver(unityContainer)); 
     castleContainer.Register(
      Component.For<SomeType>()); 

     var result = castleContainer.Resolve<SomeType>(); 
    } 
} 

public interface IDependency { void Foo(); } 
public class Dependency1 : IDependency { public void Foo() { } } 

public interface IPropertyDependency { } 
public class PropertyDependency1 : IPropertyDependency { } 
public class SomeType 
{ 
    public SomeType(IDependency dependency) { ConstructorDependency = dependency; } 

    public IDependency ConstructorDependency { get; private set; } 
    public IPropertyDependency PropertyDependency { get; set; } 
} 

public class UnityResolver : ISubDependencyResolver 
{ 
    public UnityResolver(UnityContainer container) 
    { 
     Container = container; 
    } 
    public bool CanResolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency) 
    { 
     return Container.Registrations.Any(z => z.RegisteredType.Equals(dependency.TargetType)); 
    } 

    public object Resolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency) 
    { 
     return Container.Resolve(dependency.TargetType); 
    } 

    public UnityContainer Container { get; set; } 
} 

Và kết quả:

enter image description here

Đối với các mã cho kiểm tra Unity cho CanResolve - Tôi chắc chắn rằng nó có thể được cải thiện - tôi không k bây giờ nhiều về Unity

+0

Tôi đã thử điều này. Các ideea là ... Làm thế nào lâu đài biết rằng ông đã tiêm một giao diện cụ thể thông qua tiêm tài sản? Cách duy nhất anh có thể biết là bằng cách có giao diện đó trong bản đồ phụ thuộc. Nếu không, anh ta thậm chí sẽ không cố tiêm nó. –

+0

@GeorgeLica - Đối với tài sản tiêm nó dường như không phải là một vấn đề - [Xem tài liệu] (https://github.com/castleproject/Windsor/blob/master/docs/how-dependencies-are-resolved .md # how-dependencies-are-resolve) –

+0

@Alexandru Marculescu - Hãy xem xét trao giải thưởng tiền thưởng :) Câu trả lời giải quyết câu hỏi này –

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