簡體   English   中英

在StructureMap中使用短暫的表單對象

[英]Using a short-lived form objects with StructureMap

我有我正在寫的這個應用程序,由於它的規模,它在組織方面有點麻煩。 我認為這將是使用StructureMap v3.1.4.143實現IoC的理想選擇。

我在Program.cs中設置對象圖,並創建一個在其構造函數中具有一些依賴性的應用程序上下文。 其中之一是啟動畫面形式。 當應用程序上下文運行時,它將顯示此表單,並根據初始化時發生的情況更新表單上的當前狀態。

這個對象是非常臨時的,一旦我將其處置,StructureMap會如何處理它? 它是否以某種方式緩存對象? 如果確實以某種方式緩存了對象,則讓該對象生根並處置似乎是一種浪費。 我應該使用嵌套容器嗎? 我試圖避免在我可以管理的情況下傳遞容器,並且應用程序上下文必須處置此對象,因為它調用了Application.Run(它是模態的)。 那么有什么好方法可以處理這種情況? 我真的不想讓周圍的對象閑逛,當不再使用它們時GC無法到達這些對象。

這會導致另一個可能出現的設計問題:如果我單擊一個按鈕,然后創建,處理和處置了一個新表單,我將如何通過StructureMap處理此問題? 我需要在運行時(僅按需)創建表單。 而且我也不想在用戶使用完它之后保留它(我認為這很浪費)。 如果我處理該表單,並使用由StructureMap注入的工廠方法創建新實例,它將以已處理狀態返回先前的實例嗎?

只是為了立即解決這個問題:在表單關閉中“隱藏”它不是這里的選擇。

這確實是我不習慣的另一種思考方式。 因此,任何指導將不勝感激。

作為序言,我想說我對Forms沒有任何經驗,我不確定Forms如何處理IoC容器集成-因此,我不確定這個答案到底有多有用; 但是,聽起來確實解決此問題的方法是使用StructureMap的嵌套容器功能。

文檔摘錄:

嵌套容器是StructureMap中的一項強大功能,可在短期操作的情況下進行服務解析和清理對象。 嵌套容器在2.6版中引入,但是在性能上(在大型應用程序中創建嵌套容器的時間減少了100倍)和ahem生命周期機制均是3.0版本的主要目標。

使用嵌套容器,您可以從本質上講是配置容器的克隆,適用於短期操作。 對嵌套容器的任何更改都不會反映在創建它的容器中。

創建嵌套容器非常容易,可以通過在您的IContainer實例上調用GetNestedContainer()方法來執行。 這是一個例子:

IContainer container = new Container();
container.Configure(c =>
{
    c.IncludeRegistry<ConfigurationRegistry>();
});

IContainer myNestedContainer = container.GetNestedContainer();
myNestedContainer.Dispose();

從示例中可以看到,嵌套容器實現了IDisposable接口,因此一旦完成容器操作,便可以手動處理它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM