試圖在我的新應用程序套件中構建一個基本的3層體系結構。我第一次想開始應用最佳設計實踐(如IoC/DI e.t.c)。我的用戶界面將在各種用途中創建Business Objects?或不?
我的UI層必須創建一個BLL對象才能完成工作。
可以說我的用戶界面需要調用BLL 10次。我將不得不創建我的BLL對象10次,否則我將不得不在表單加載時創建它一次?
試圖在我的新應用程序套件中構建一個基本的3層體系結構。我第一次想開始應用最佳設計實踐(如IoC/DI e.t.c)。我的用戶界面將在各種用途中創建Business Objects?或不?
我的UI層必須創建一個BLL對象才能完成工作。
可以說我的用戶界面需要調用BLL 10次。我將不得不創建我的BLL對象10次,否則我將不得不在表單加載時創建它一次?
我的UI層必須創建一個BLL對象才能完成它的工作。
首選的做法是在業務層對象的接口被注入到你的GUI形式,在創建或更新通特性。在這種情況下,您的表單對業務層對象一無所知,不會打擾實例化它們,並且只做它應該做的事情 - GUI交互。
個人而言,我更喜歡構造函數注入:
public class MyForm
{
private IDocumentStorage documentStorage;
private IJobsRegistrator jobsRegistrator;
public MyForm(IDocumentStorage documentStorage, IJobsRegistrator jobsRegistrator)
{
this.documentStorage = documentStorage;
this.jobsRegistrator = jobsRegistrator;
}
}
凡IDocumentStorage
和IJobsRegistrator
是你的業務層的接口。如果存在一些限制(比如說,只能有無參數的構造函數),則可以使用屬性設置器。
嗯......如果您希望直接回答這個問題,您會感到失望。答案是 - 這取決於。
如果你的對象是一個無狀態的輕量級對象 - 繼續創建它,如果它讓你的生活更輕鬆。另一方面,如果你的對象需要維護狀態,或者需要大量的資源來創建它,那麼必須創建它作爲一個單例,同時還需要創建/管理單例的所有開銷。
這兩種情況都被DI容器支持,但它是由你來選擇適合您的方案
如果我的BLL和DAL被Windows窗體和網絡應用程序大量使用,是不是一個不好的選擇? – e4rthdog
它取決於您如何定義「單例」 - 大多數IoC容器支持單例類型生命週期管理的概念,但這並不意味着該對象本身是作爲單例實現的。 –
這是正常的,每次調用重建你的業務對象是正確的。 這有助於維護一個無狀態的應用程序,如果您製作基於HTTP的網站,這就是您想要的。
如果由於某些真正重量級的對象而導致問題出現,則可以採取一些措施,例如創建對象緩存/池或將其保存在Session對象中。除非你發現你必須去那裏,否則不要去那裏。
如果對象是一個服務類型類,即接受一些輸入並提供一些輸出(比如一個存儲庫類型對象),你會希望你的UI層依賴於它的抽象版本,例如:
public class UILayerComponent
{
private readonly IBLLObject _bllobject;
public UILayerComponent(IBLLObject obj)
{
_bllobject = obj;
}
}
但是UI層應該對這個對象的實例化,生命週期管理甚至是具體的實現都一無所知。這應該是您的IoC容器處理的工作。但是,如果對象是由狀態驅動的 - 例如,由一個用戶操作創建,並且由另一個用戶操作更新或刪除 - 則應該在創建並處理它時纔有意義。
嚴格地說 - 簡單的3層
第1層 - 數據庫 這裏沒有邏輯,只是數據retreival和存儲經由RDBMS機制
方法2 - 商業邏輯/數據訪問 數據訪問對象(通過/從這裏創建業務對象)以及應從這裏創建/填充/保存業務數據(域)對象
第2層用戶界面 除了呈現業務對象來自Tier 2)給用戶創建/操作用戶
因此,如果我理解正確,我將在使用時多次在我的UI中注入BLL對象。 – e4rthdog
@ e4rthdog不,你在表單創建時注入一次並保持引用。 –