Tôi đã thử nghiệm bằng cách sử dụng các đại biểu có tên thay vì giao diện đơn phương pháp. Này có một số lợi thế cho mã kích thước, như chúng ta có thể đi từ (một số linebreaks loại bỏ để không nhấn mạnh đến những trường hợp):Có cách nào đơn giản để đăng ký đóng cửa tĩnh với Castle Windsor?
public interface IProductSource
{
IEnumerable<Product> GetProducts();
}
public class DataContextProductSource : IProductSource
{
private readonly DataContext _DataContext;
public DataContextProductSource(DataContext dataContext)
{
if (dataContext == null) throw new ArgumentNullException("dataContext");
_DataContext = dataContext;
}
public IEnumerable<Product> GetProducts()
{
return _DataContext.Products.AsEnumerable();
}
}
tới:
public delegate IEnumerable<Product> DGetProducts();
public static class DataContextFunctions
{
public DGetProducts GetProducts(DataContext dataContext)
{
if (dataContext == null) throw new ArgumentNullException("dataContext");
return() => dataContext.Products.AsEnumerable();
}
}
này về cơ bản là lợi dụng thực tế rằng một khi bạn đi đủ xa với tiêm phụ thuộc, rất nhiều lớp học trở nên ít hơn đóng cửa. Các lớp đó có thể được thay thế bằng các hàm trả về lambdas. Toàn bộ các hàm liên quan (không cần phải đóng gói bất kỳ trạng thái có thể thay đổi nào, nhưng sẽ được biểu diễn bằng cách sử dụng các lớp trong "dependency" dependency injection), sau đó có thể được cuộn lên thành một lớp tĩnh (hoặc "module" trong VB parlance) .
Đây là tất cả tốt và tốt, nhưng tôi đang gặp khó khăn khi tìm cách tốt nhất để đăng ký các phương pháp tĩnh này với Castle Windsor. Các phương pháp không phụ thuộc dễ dàng:
Component.For<DGetIntegers>().Instance(Integers.GetOneToTen)
Nhưng DataContextFunctions.GetProducts của chúng tôi ở trên có một số phụ thuộc. Cách tốt nhất mà tôi đã tìm thấy để đăng ký này là:
Component.For<DGetProducts>().UsingFactoryMethod(
kernel => DataContextFunctions.GetProducts(kernel.Resolve<DataContext>())
này có thể nhận được khá rườm rà, và rõ ràng là cần phải hỏi kernel trực tiếp đối với từng phụ thuộc loại đánh bại điểm một chút. Dường như với tôi rằng tất cả các thông tin tĩnh mà một container cần có sẵn, vì vậy nó sẽ có thể làm điều này.
Câu hỏi là, Castle Windsor (hay bất kỳ container nào khác) có cách đơn giản để làm điều này mà tôi đã bỏ lỡ, hoặc có vấn đề kỹ thuật phát sinh, hoặc nó chỉ là quá thích hợp một trường hợp sử dụng đã được bao gồm?
Cảm ơn, Krzysztof. Tôi sẽ cố gắng thực hiện điều đó và báo cáo lại kết quả. Bất kỳ liên kết nào cho một nơi tốt để bắt đầu? – ninjeff
@ninjeff nếu bạn đang ở trên 2.5.x tài liệu sẽ giúp bạn bắt đầu docs.castleproject.org/(S(hucszcu5ilznbv45fvrim355))/… Nếu bạn đang sử dụng 3,0 beta, có một số thay đổi về API mặc dù các khái niệm vẫn là tương tự. Hãy cho tôi biết nếu doco ít hơn hoàn hảo –
Tôi đã có thể làm việc này. Tôi sẽ đăng một liên kết và mô tả với câu trả lời của riêng tôi trong một giờ (những người dùng có nghiệp vụ thấp như tôi không thể trả lời các câu hỏi của chúng tôi trong vòng tám giờ). – ninjeff