2008-10-28 69 views
1

我正在開發使用DDD哲學開發的業務應用程序。數據庫通過NHibernate訪問,數據層使用DAO模式實現。訪問數據層中的多個數據提供者

UML類圖如下所示。

UML Class Diagram http://img266.imageshack.us/my.php?image=classdiagramhk0.png http://img266.imageshack.us/my.php?image=classdiagramhk0.png

我不知道這個設計是好還是不好。你怎麼看?

但問題不在於設計是否好。問題是啓動應用程序的IDaoFactory在表示層被實例化併發送作爲參數來呈現類(這是使用MVC模式設計),如下

... 
IDaoFactory daoFactory = new NHibernateDaoFactory(); //instantiation in main class 
... 
SamplePresenterClass s = new SamplePresenterClass(daoFactory); 
... 

只使用一個數據提供者(其只是一個數據庫後)很簡單。但是現在我們也應該從XML獲取數據。在開發的下一階段,我們應該連接到不同的Web服務並操縱傳入和傳出的數據。

來自XML的數據將使用一個枚舉鍵來獲得。我們將一個名爲XMLLoader的類添加到數據層,並將一個接口ILoader添加到域中。 XMLLoader有其簽名是

List<string> LoadData(LoaderEnum key) 

如果我們在表示層與XMLLoader實例ILoader下面我們將其發送到將要得到的數據層的一些XML數據對象的方法。

ILoader loader = new XMLLoader(); 
SamplePresenterClass s = new SamplePresenterClass(daoFactory, xmlLoader); 

實現Web服務訪問類

SamplePresenterClass s = new SamplePresenterClass(daoFactory, xmlLoader, sampleWebServiceConnector1, sampleWebServiceConnector2, ...); 

後的參數是要及時種植。我想我可以在一個類中容納數據訪問對象的所有實例,並將其傳遞給所需的演示者(也許單身模式也可以)。在領域層必須有這樣的一類,

public class DataAccessHolder 
{ 
    private IDaoFactory daoFactory; 
    private ILoader loader; 
    ... 
    public IDaoFactory DaoFactory 
    { 
     get { return daoFactory; } 
     set { daoFactory = value; } 
    } 
    ... 
} 

在主類的實例可以使用此設計作出如下

DataAccessHolder dataAccessHolder = new DataAccessHolder(); 
dataAccessHolder.DaoFactory = new NHibernateDaoFactory(); 
dataAccessHolder.Loader = new XMLLoader(); 
... 
SamplePresenterClass s = new SamplePresenterClass(dataAccessHolder); 

,你怎麼看待這樣的設計也可以建議我一個不同的?

感謝所有repliers ...

+0

您的圖像已死。 – Nix 2013-01-11 18:30:35

回答

1

IMO,這將是清潔劑使用「全球」或靜態daoFactory並使其通用性。

DaoFactory<SamplePresenterClass>.Create(); // or 
DaoFactory<SamplePresenterClass>.Create(id); // etc 

然後,您可以定義DaoFactory<T>只能採取,比如說,IDao

interface IDao 
{ 
    IDaoProvider GetProvider(); 
} 

interface IDaoProvider 
{ 
    IDao Create(IDao instance); 
    void Update(IDao instance); 
    void Delete(IDao instance); 
} 

基本上而不是通過每一個構造你的DaoFactory,您使用靜態通用DaoFactory。它的T必須繼承IDao。然後DaoFactory類可以看看在T提供商在運行時:

static class DaoFactory<T> where T : IDao, new() 
{ 
    static T Create() 
    { 
     T instance = new T(); 
     IDaoProvider provider = instance.GetProvider(); 

     return (T)provider.Create(instance); 
    } 
} 

哪裏IDaoProvier是,你將實現裝載使用XML,NHibernate的,Web服務等,這取決於類的東西的通用接口。 (每個IDao對象都知道如何連接到它的數據提供者)。

總體而言,不是一個糟糕的設計。再添加一點OO,你就會擁有漂亮的設計。例如,XmlEnums的每個文件可以實現爲IDao

class Cat : IDao 
{ 
    IDaoProvider GetProvider() 
    { 
     return new XmlLoader(YourEnum.Cat); 
    } 

    // ... 
} 
+0

我反覆閱讀,但無法得到它。 DaoFactory 和GetProvider的目的是什麼? 正如我所說我必須使用所有的提供者。一些數據將被寫入數據庫,其中一些將從XML文件等中讀取。 – xelon 2008-10-28 14:55:17