2011-09-21 37 views
7

Tôi có 2 triển khai cùng một giao diện và muốn sử dụng implementation1 nếu người dùng đăng nhập hoặc triển khai 2 nếu người dùng chưa đăng nhập. Làm thế nào tôi có thể cấu hình với windsor lâu đài?Lâu đài windor Thêm phụ thuộc có điều kiện

Trả lời

1

Một cách để giải quyết vấn đề này là, Đăng ký dịch vụ bằng khóa rồi giải quyết khi bạn cần.

public interface ISample 
{ 
    int Calculate(int a, int b); 
} 

class SampleB : ISample 
{ 
    public int Calculate(int a, int b) 
    { 
     return a + b + 10; 
    } 
} 

class SampleA : ISample 
{ 
    public int Calculate(int a, int b) 
    { 
     return a + b; 
    } 
} 

Việc đăng ký:

 container.Register(Component.For<ISample>().ImplementedBy<SampleA>().Named("SampleA").LifeStyle.Transient); 
     container.Register(Component.For<ISample>().ImplementedBy<SampleB>().Named("SampleB").LifeStyle.Transient); 

// Giải quyết khi SampleA cần thiết.

var sampleA = container.Resolve<ISample>("SampleA"); 

// Giải quyết khi SampleB cần.

var sampleB = container.Resolve<ISample>("SampleB"); 
+1

nơi bạn sẽ gọi 'container.Resolve()'? –

+0

Không có cách nào windsor sẽ biết người dùng được đăng nhập hay không trừ khi bạn thay đổi/mở rộng nó thực hiện nội bộ. Có thể có một lớp Decider ở giữa mà sẽ có 'yếu tố đăng nhập' trong tài khoản và cung cấp cho việc thực hiện mong muốn. –

+0

Windsor * có * có cơ chế cho điều này (xem câu trả lời của mookid), nó không cần thiết để thay đổi thực hiện nội bộ của nó cả. –

7

Bạn có thể thêm handler selector, có thể chọn giữa các triển khai sẵn có tùy thuộc vào ví dụ: cho dù Thread.CurrentPrincipal đã được đặt (hoặc HttpContext.Current.Request.IsAuthenticated trong ASP.NET/MVC nếu tôi nhớ chính xác).

Bộ chọn xử lý có lẽ sẽ trông hơi như thế này:

public class MyAuthHandlerSelector : IHandlerSelector 
{ 
    public bool HasOpinionAbout(string key, Type service) 
    { 
     return service == typeof(ITheServiceICareAbout); 
    } 

    public IHandler SelectHandler(string key, Type service, IHandler[] handlers) 
    { 
     return IsAuthenticated 
      ? FindHandlerForAuthenticatedUser(handlers) 
      : FindGuestHandler(handlers); 
    } 

    bool IsAuthenticated 
    { 
     get { return Thread.CurrentPrincipal != null; } 
    } 
    // .... 
} 

Chỉ Nhược điểm của bộ chọn handler là họ đang không kéo từ container - tức là họ đang thêm vào như là một ví dụ để các container tại đăng ký thời gian, do đó, họ không nhận được phụ thuộc tiêm, lối sống quản lý, vv, nhưng có những cách để giảm thiểu đó - hãy xem F.T.Windsor nếu bạn quan tâm đến việc xem làm thế nào có thể được thực hiện.

+1

tự hỏi nếu với phiên bản 3.0 bất cứ điều gì thay đổi - Tôi có nghĩa là nếu nó vẫn còn cần thiết bên ngoài cơ sở. – Giedrius

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