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.
Điều đó khiến tôi bắt đầu - cảm ơn nhiều! – GraemeF