2008-10-28 111 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