2012-12-12 64 views
0

試圖在我的新應用程序套件中構建一個基本的3層體系結構。我第一次想開始應用最佳設計實踐(如IoC/DI e.t.c)。我的用戶界面將在各種用途中創建Business Objects?或不?

我的UI層必須創建一個BLL對象才能完成工作。

可以說我的用戶界面需要調用BLL 10次。我將不得不創建我的BLL對象10次,否則我將不得不在表單加載時創建它一次?

回答

1

我的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; 
    } 
} 

IDocumentStorageIJobsRegistrator是你的業務層的接口。如果存在一些限制(比如說,只能有無參數的構造函數),則可以使用屬性設置器。

+0

因此,如果我理解正確,我將在使用時多次在我的UI中注入BLL對象。 – e4rthdog

+1

@ e4rthdog不,你在表單創建時注入一次並保持引用。 –

0

嗯......如果您希望直接回答這個問題,您會感到失望。答案是 - 這取決於。

如果你的對象是一個無狀態的輕量級對象 - 繼續創建它,如果它讓你的生活更輕鬆。另一方面,如果你的對象需要維護狀態,或者需要大量的資源來創建它,那麼必須創建它作爲一個單例,同時還需要創建/管理單例的所有開銷。

這兩種情況都被DI容器支持,但它是由你來選擇適合您的方案

+0

如果我的BLL和DAL被Windows窗體和網絡應用程序大量使用,是不是一個不好的選擇? – e4rthdog

+0

它取決於您如何定義「單例」 - 大多數IoC容器支持單例類型生命週期管理的概念,但這並不意味着該對象本身是作爲單例實現的。 –

1

這是正常的,每次調用重建你的業務對象是正確的。 這有助於維護一個無狀態的應用程序,如果您製作基於HTTP的網站,這就是您想要的。

如果由於某些真正重量級的對象而導致問題出現,則可以採取一些措施,例如創建對象緩存/池或將其保存在Session對象中。除非你發現你必須去那裏,否則不要去那裏。

+0

因此,例如,如果我有一個簡單的條形碼應用程序,想檢查是否存在很多,每當用戶按下按鈕時,我應該創建一個BLL對象(通過將DAL對象注入其構造函數)並調用BLL方法檢查將應用我想要的邏輯並與DAL交互。正確? – e4rthdog

+0

@ e4rthdog我的第一個想法是,像這樣的東西可以在靜態類/方法內處理。在這種情況下,你不需要實例化任何東西。你有什麼理由需要一個實際的對象嗎? – Erix

+0

我可能需要有多個dal,這取決於我的後端數據庫,並且通常它會增加併發症和需求的排除時間 – e4rthdog

0

如果對象是一個服務類型類,即接受一些輸入並提供一些輸出(比如一個存儲庫類型對象),你會希望你的UI層依賴於它的抽象版本,例如:

public class UILayerComponent 
{ 
    private readonly IBLLObject _bllobject; 

    public UILayerComponent(IBLLObject obj) 
    { 
     _bllobject = obj; 
    } 

} 

但是UI層應該對這個對象的實例化,生命週期管理甚至是具體的實現都一無所知。這應該是您的IoC容器處理的工作。但是,如果對象是由狀態驅動的 - 例如,由一個用戶操作創建,並且由另一個用戶操作更新或刪除 - 則應該在創建並處理它時纔有意義。

0

嚴格地說 - 簡單的3層

第1層 - 數據庫 這裏沒有邏輯,只是數據retreival和存儲經由RDBMS機制

方法2 - 商業邏輯/數據訪問 數據訪問對象(通過/從這裏創建業務對象)以及應從這裏創建/填充/保存業務數據(域)對象

第2層用戶界面 除了呈現業務對象來自Tier 2)給用戶創建/操作用戶