我最初是按照这篇 codeproject 文章中概述的 s# 架构示例来设计我的系统的(不幸的是,我没有使用 NHibernate)。基本思想是,对于需要与持久层通信的每个域对象,您将在不同的库中拥有相应的数据访问对象。每个数据访问对象都实现一个接口,当域对象需要访问数据访问方法时,它总是针对接口进行编码,而不是针对 DAO 本身进行编码。
当时,我仍然认为这种设计非常灵活。然而,随着我的领域模型中对象数量的增加,我发现自己在质疑这里是否存在组织问题。例如,几乎域中的每个对象都以相应的数据访问对象和数据访问对象接口结束。不仅如此,而且每一个都位于不同的位置,如果我想做一些简单的事情,比如在一些命名空间周围移动,这将更难以维护。
有趣的是,这些 DAO(及其相应的接口)中的许多都是非常简单的生物——最常见的只有一个 GetById() 方法。我最终得到了一大堆对象,例如
public interface ICustomerDao {
Customer GetById(int id);
}
public interface IProductDao {
Product GetById(int id);
}
public interface IAutomaticWeaselDao {
AutomaticWeasel GetById(int id);
}
他们的实现者通常也很琐碎。这让我想知道朝不同的方向前进是否会更简单,也许通过为简单的数据访问任务设置一个对象来改变我的策略,并为那些需要更多东西的人保留专用数据访问对象的创建复杂。
public interface SimpleObjectRepository {
Customer GetCustomerById(int id);
Product GetProductById(int id);
AutomaticWeasel GetAutomaticWeaselById(int id);
Transaction GetTransactioinById(int id);
}
public interface TransactionDao {
Transaction[] GetAllCurrentlyOngoingTransactionsInitiatedByASweatyGuyNamedCarl();
}
有没有人对这样的架构有任何经验?总的来说,我对设置非常满意,因为现在我唯一关心的是管理所有这些小文件。但是,我仍然想知道还有哪些其他构建数据访问层的方法。