1

我正在开发一个使用 DDD 理念开发的业务应用程序。数据库通过 NHibernate 访问,数据层使用 DAO 模式实现。

UML 类图如下所示。

UML 类图 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);

你觉得这个设计怎么样,或者你能给我推荐一个不同的设计吗?

感谢所有回复...

4

1 回答 1

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对象都知道如何连接到它的数据提供者)。

总的来说,虽然不是一个糟糕的设计。添加更多的面向对象,您将拥有一个非常漂亮的设计。例如, 的每个文件都XmlEnums可以实现为IDao

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

    // ...
}
于 2008-10-28T14:44:13.520 回答