2009-11-20 25 views
5

Tài liệu cho Autofac có trang thú vị mô tả khả năng tự động tạo delegate factories. Nó cũng mạnh mẽ cho thấy rằng bạn có thể nhận được kết quả tương tự mà không có Autofac bằng cách viết chúng bằng tay.Làm cách nào để triển khai nhà máy được ủy quyền?

Tôi đang sử dụng Unity cho IoC và muốn tránh bỏ qua vùng chứa xung quanh đối tượng cần tạo đối tượng khác, vậy bạn sẽ viết một nhà máy đại biểu không có Autofac như thế nào?

Trả lời

6

Tôi chưa bao giờ sử dụng Unity cho đến nay, vì vậy câu trả lời của tôi khá mơ hồ.

Hiệu trưởng rất đơn giản. Bạn xác định một số đại biểu đại diện cho các nhà máy. Sau đó, bạn tạo một 'nhà máy'-class có phương pháp công cộng phù hợp với các đại biểu. Lớp này biết container. Bây giờ bạn đăng ký ủy nhiệm và thiết lập lớp đó là triển khai thực hiện. Sau đó, bạn chỉ có thể tiêm đại biểu. Khi bạn gọi ủy nhiệm được tiêm, lớp nhà máy được gọi, nó sẽ biết vùng chứa và yêu cầu thùng chứa cho một cá thể mới.

Trước tiên, bạn xác định đại diện nhà máy của mình.

public delegate TServiceType Provider<TServiceType>(); 
public delegate TServiceType Provider<TArg,TServiceType>(TArg argument); 

Các bạn tạo một nhà máy chung:

/// <summary> 
/// Represents a <see cref="Provider{TArg,TServiceType}"/> which holds 
/// the container context and resolves the service on the <see cref="Create"/>-call 
/// </summary> 
internal class GenericFactory{ 
    private readonly IContainer container; 

    public ClosureActivator(IContainer container) 
    { 
     this.container= container; 
    } 

    /// <summary> 
    /// Represents <see cref="Provider{TServiceType}.Invoke"/> 
    /// </summary> 
    public TService Create() 
    { 
     return container.Resolve<TService>(); 
    } 
    /// <summary> 
    /// Represents <see cref="Provider{TArg,TServiceType}.Invoke"/> 
    /// </summary> 
    public TService Create(TArg arg) 
    {   
     return container.Resolve<TService>(new[] {new TypedParameter(typeof (TArg),arg)}); 
    } 
} 

Bây giờ những gì bạn đăng ký đại biểu, một cái gì đó như thế này:

var newServiceCreater = new GenericFactory(container); 
container.Register<Provider<MyCompoent>>().To(newServiceCreater.Create); 

var newServiceCreater = new GenericFactory(container); 
container 
    .Register<Provider<OtherServiceWithOneArgumentToConstruct>>() 
    .To(newServiceCreater.Create); 

Bây giờ khác bạn tiêm với các thành phần khác chỉ là 'nhà cung cấp 'thay vì container.

+0

Điều đó khiến tôi bắt đầu - cảm ơn nhiều! – GraemeF

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