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