2009-04-28 50 views
1

假設我有一個WinForm CRUD(like)應用程序。我想遵循這個最佳實踐,所以我嘗試使其遵循OOP和n層設計。我在哪裏實例化CRUD n-Layred WinForm應用程序中的對象?

不幸的是,我很熟悉這些詞,但不是他們的做法。讓我們來看看下面的例子:我的CaseNote程序。我有一個選項卡式應用程序,您可以在搜索選項卡中查找成員,然後選擇其中一個選項即可訪問CaseNote選項卡,以創建新的案例說明,查看現有的CaseNotes,或爲Parent創建後續CaseNote注意。所有這些都是針對您從搜索標籤中選擇的成員。

因此,如果我創建對象並將它們傳遞給不同的窗體使用,我應該在哪裏實例化它們?我原以爲我會有3層; UI,對象,DAL。我跌倒的地方就是我想要的東西。我無法在對象層中將它們實例化,是嗎?此外,如果我在表單上將它們實例化,我如何將它們從表單傳遞到相當大的應用程序中?

CaseNotes Screen Shot

回答

2

如果你想看看這個問題的更多詞語你想看看MVP和MVC。 (這些代表模型視圖控制器和模型視圖演示者)。有些人會說我這樣說,但他們在概念上非常相似。

MVP和MVC的目標是讓您設計您的應用程序邏輯,而無需考慮您的應用程序外觀。它還允許您定義您的用戶交互,而無需實施實際的GUI。從本質上講,你的模型是你的應用程序邏輯,你的數據,你的類實際上做類似於你的數據庫的類。您的演示者或控制者是與您的模型進行交互的內容,以及控制您的用戶界面並對界面上的用戶操作做出反應的內容。最後,您的視圖是您的Winforms設計或您的網頁。

我相信你可以在網上找到大量有關這方面的材料,但是給你一些具體的幫助,這個問題應該用來告知和說明你的閱讀。

您需要做的第一件事就是開始創建表示數據的對象。因此,您將擁有包含案例數據的CaseNote對象。您將擁有某種類型的案例說明數據容器,例如案例說明數據庫。您可以定義這些邏輯操作和屬性,就好像它們在哪裏實際項目一樣。

然後,您將繼續定義您的演示者或控制器,它將定義您要從GUI支持的操作。同時,您應該定義一個接口,以便爲演示者/控制器定義在GUI上可以執行哪些操作。因此,例如,您的演示者可能會公開一個名爲SearchForCaseNote的方法,該方法接受一個字符串參數。您的視圖界面將公開一種名爲DisplayCaseNote的方法。當用戶點擊搜索按鈕時,視圖將通過命令傳遞給演示者,演示者然後將調用模型來獲取數據。演示者可以在此處格式化數據,即將DateTime對象轉換爲字符串,然後通過名爲DisplayCaseNote的接口定義方法將數據傳回給視圖。

您不必使用視圖界面,​​您可以直接調用視圖,但具有界面意味着您可以有許多不同的視圖實現。

我需要提到的最後一件事是創建應用程序的這些不同部分的地方。我的觀點是應該從演示者/控制器中消失的一切。所以當你啓動應用程序時,它創建了演示者/控制器對象,然後創建並顯示你的視圖,將它自己作爲變量傳遞給視圖。然後,演示者/控制器可以通過從磁盤加載初始模型或通過像unity這樣的依賴注入容器理想地發現它們來創建初始模型。實際上,使用unity來發現視圖實現可能是一個更好的主意,因爲它可以讓您在視圖和演示者/控制器之間真正分離。當你移動到另一個視圖(即打開另一個窗口)時,演示者/控制器應該公開一個方法,例如DisplayDetailPage,當單擊按鈕時該視圖將調用該方法。這將爲下一個視圖創建演示者/控制器,從而創建視圖並獲取對該模型的引用。

希望這會有所幫助。