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
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");
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.
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
- 1. programatically thay đổi phụ thuộc vào Lâu đài Windsor
- 2. maven phụ thuộc có điều kiện
- 3. Phụ thuộc đá quý có điều kiện
- 4. Nhiều giao diện tiêm với lâu đài windsor
- 5. PBKDF2 trong Lâu đài Bouncy C#
- 6. Lâu đài Windsor nội Constructor/Lớp
- 7. Lâu đài Windsor Giải quyết và Generics
- 8. Tiêm phụ thuộc dựa trên điều kiện
- 9. Phụ thuộc có điều kiện trong Ruby Gemspec
- 10. Thêm thuộc tính phụ thuộc để điều khiển
- 11. "Điều kiện có điều kiện" trong mệnh đề WHERE (Điều kiện áp dụng nào phụ thuộc vào cờ "chế độ")
- 12. d3 thêm thuộc tính dữ liệu có điều kiện
- 13. Điểm ngắt điều kiện phụ thuộc dòng không
- 14. Giải mã C# RSA sử dụng Lâu đài Bouncy
- 15. Lâu đài Windsor Tính chất tiêm của vật thể xây dựng
- 16. Tạo Chứng chỉ X509 bằng Lâu đài Bouncy Java
- 17. Tải trọng lười biếng với Cơ sở Lâu đài NHibernate
- 18. tham gia điều kiện mysql phụ thuộc vào một cột
- 19. Đọc RSA PrivateKey trong C# và Lâu đài Bouncy
- 20. Handlebars thuộc tính lớp có điều kiện
- 21. Các câu lệnh điều kiện C++ có mang phụ thuộc từ biểu thức điều kiện đến câu lệnh không?
- 22. Có vẻ như bạn quên đăng ký mô-đun http với Lâu đài Windsor với IIS7
- 23. Làm cách nào để thêm điều kiện thuộc tính id vào TAL (PHPTAL) theo điều kiện?
- 24. xây dựng một viên đá quý ruby và có điều kiện xác định phụ thuộc
- 25. C#! Thuộc tính có điều kiện?
- 26. NuGet Restore Không có phụ thuộc khi phụ thuộc thêm mục nhập .target vào .csproj
- 27. Chúng ta có thể tăng tốc độ lâu đài cát không?
- 28. IntelliJ Idea (gỡ lỗi) điểm ngắt có điều kiện phụ thuộc vào các điểm ngắt khác
- 29. Windbg Đặt điểm ngắt có điều kiện phụ thuộc vào Ngăn xếp cuộc gọi
- 30. Phụ thuộc công việc của Autosys R11 với điều kiện thời gian chạy công việc phụ thuộc
nơi bạn sẽ gọi 'container.Resolve()'? –
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. –
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ả. –