Tôi nghĩ rằng nó tương ứng với Prism hoặc MEF, nhưng với nguyên tắc Dependency Injection và các phương pháp hay nhất nói chung. (Yeah, tôi hôn rằng MEF không phải là DI container, nhưng ở đây nó được sử dụng gần như là DI container, vì vậy tôi giả sử sử dụng các thực hành tương tự ở đây).
Trong thực hành tốt nhất của DI (this cuốn sách là rất mát mẻ, tôi khuyên bạn nên nó) rất tốt để có các bước như vậy trong DI "công việc":
- đăng ký tất cả các loại cần thiết (trong Prism - bởi Bootstrapper. ConfigureCatalog() phương pháp)
- đối tượng quyết tâm gốc (với tất cả các đối tượng lồng nhau Trong Prism -. bởi Bootstrapper.CreateShell() phương pháp)
- sử dụng đối tượng gốc của bạn
- phát hành bạn đối tượng gốc
Lý tưởng nhất, bạn KHÔNG nên sử dụng DI container nữa. Mã của bạn KHÔNG nên biết về sự tồn tại của DI container (từ bên này Unity thực sự là DI container, bởi vì bạn có thể viết mã mà sẽ không biết về việc sử dụng DI container). Nếu mã của bạn biết về nó - nó PHỤC VỤ trên DI container, và đó là điều xấu.
PS.Nếu bạn muốn sử dụng thùng chứa MEF trong mô-đun của bạn anyway (ví dụ, bởi vì bạn không phải là rất quen thuộc với DI mô hình hoặc bạn có một số nhiệm vụ rất cụ thể), bạn có thể thử một cái gì đó như:
[ModuleExport(typeof(YourModule))]
public class YourModule : IModule
{
public static CompositionContainer CompositionContainer;
[ImportingConstructor]
public void YourModule(CompositionContainer container)
{
this.CompositionContainer = container;
}
}
Đừng quên đăng ký hộp chứa MEF của bạn trong Boostrapper của bạn:
public class YourBootstrapper: MefBootstrapper
{
protected override CompositionContainer CreateContainer()
{
var container = base.CreateContainer();
container.ComposeExportedValue(container);
return container;
}
}
trong khi tôi đồng ý với các phương pháp hay nhất, tài liệu lăng kính nêu rõ rằng bạn có thể sử dụng phương pháp Khởi tạo phương pháp của bạn cũng như "Đăng ký dịch vụ được chia sẻ với vùng chứa phụ thuộc của ứng dụng." http://msdn.microsoft.com/en-us/library/gg405479%28v=pandp.40%29.aspx – Console
Nếu chúng ta không được biết về thùng chứa, thì làm cách nào các mô-đun có thể đăng ký các dịch vụ được chia sẻ mới? – Benjamin
'ComposeExportedValue' đã đề cập là một phương thức mở rộng trong 'System.ComponentModel.Composition.AttributedModelServices' – jan