我可以在層次結構中使用DI容器創建新對象嗎?爲每個DI容器設置依賴關係,然後按類型聲明getInstance,並正確創建實例。另外,你可以閱讀很多文章,解釋DI容器應該位於主函數的層次結構的頂部,它不應該被傳遞或單獨傳遞。但是如果我想從容器中的實例從對象的層次結構中下來呢?我可以在層次結構中使用DI容器嗎?
回答
避免讓應用程序代碼(啓動代碼除外)直接依賴容器或對容器的抽象;這是一種反模式,稱爲Service Locator。啓動代碼通常被稱爲Composition Root。
組合根是在您的應用程序中單獨的層。該層位於其他層之上,例如表示層和業務層。
但這並不意味着您不能使用容器在某種情況之後以懶惰的方式創建對象圖的某些部分。這裏有一個例子:
// Defined in a shared library of your application, accessible to all other
// code in your application.
public interface ICommandProcessor
{
public void Process(object command);
}
這個接口的可能的用法如下:
this.commandProcessor.Process(new ShipOrderCommand(orderId));
雖然抽象並沒有注意一下使用的可能容器的話,這個抽象的實現仍可以取決於一個。但是由於應用程序代碼不應該依賴容器,因此應該在Composition Root(應用程序的啓動路徑)中定義此實現。這允許應用程序保持對這種工具的存在的遺忘,而容器仍然可以用於解析對象圖。下面是一個示例實現:
public class CommandProcessor : ICommandProcessor
{
private readonly Container container;
public CommandProcessor(Container container) {
this.container = container;
}
public void Process(object command) {
Type handlerType = typeof(ICommandHandler<>).MakeGenericType(command.GetType());
dynamic handler = this.container.GetInstance(handlerType);
handler.Handle((dynamic)command);
}
}
所以長話短說,你可以使用容器延遲的方式創建對象圖,只要在你的應用程序,使用集裝箱的唯一層是構圖的根。
你說的**應用程序代碼本身不必調用GetInstance **?如何定義應用程序代碼,以及爲什麼'CommandProcessor'類的Process'方法不被視爲應用程序代碼? – Narek
@Narek:雖然Composition Root是您爲應用程序編寫的代碼的patt,但我們認爲它有點不同,並經常談論Composition Root與其他應用程序。雖然CR可能取決於Container,但您的應用程序的其餘部分可能不會。 – Steven
聽起來像'Process'方法**是應用程序的其餘部分**,對不對?所以看起來,你說應用程序代碼不應該使用,但是你在應用程序代碼中使用它。 – Narek
- 1. 我們可以在網站層次結構中移動SharePoint嗎?
- 2. 可以使用UML來表示文檔層次結構嗎?
- 3. 特徵層次結構可以在scala中匹配嗎?
- 4. C++ stdlib容器類層次結構
- 5. 我可以在「本地」窗口中展平對象層次結構嗎?
- 6. 我可以在Eclipse的類型層次結構視圖中看到接口嗎?
- 7. 插件體系結構中的DI(Autofac):每個插件都有一個單獨的DI容器可以嗎?
- 8. 我可以在Android中一起使用3層體系結構和「MVC」嗎?
- 9. 我可以在TreeView層次結構的同一級別有不同的類嗎?
- 10. 層次結構
- 11. 層次結構在SQL Server - 多層次
- 12. 使用Linq構建樹層次結構
- 13. 我可以使用富文本編輯器管理內容結構嗎?
- 14. 我可以使用docker-compose構建一個容器圖像嗎?
- 15. 有人可以向我展示rails類層次結構的圖形表示嗎?
- 16. 我可以在ATL中使用流式結構嗎?
- 17. 層次結構中的可選關係
- 18. 我可以在Flask中構建兩層以上的端點嗎?
- 19. Php,可以使用DI特性嗎?
- 20. Swing組件和包容層次結構
- 21. 層次結構查看器可以與Nexus以外的真實設備一起使用嗎?
- 22. 標籤應該有層次結構嗎?
- 23. Stylecop - 我的繼承層次結構中有x類嗎?
- 24. PHP調用層次結構
- 25. radgridview層次結構
- 26. UIView層次結構
- 27. 類層次結構
- 28. 圖中的層次結構
- 29. MVC3中的層次結構
- 30. CheckBoxList中的層次結構
請提供一些僞代碼。它很難理解你的意思是什麼樣的層次結構:call,object,type,context? – Basilevs
*我可以在層次結構中使用DI容器嗎?*您可以,但[您不應該](http://stackoverflow.com/a/2386636/126014)。 –
*如果我想從容器中的實例從對象的層次結構中獲取實例?*爲什麼要這麼做?什麼是用例? –