我刚开始了一个新项目,自然而然地选择使用了很多新技术。我正在使用(Fluent) NHibernate、ASP.NET MVC 3,并尝试应用存储库模式。我决定将业务逻辑分离到一个单独的项目中,并定义服务来包装我的存储库,以便我可以返回POCOs而不是NHibernate代理,并在前端和DA逻辑之间保持更多的分离。这也将使我能够轻松地以后提供相同的逻辑作为API(要求)。我选择使用通用的>接口,其中T是我的NHibernate映射实体之一,它们都实现了IEntity(我的接口只是一个标记而已)。问题是,这与聚合根模式相违背,我开始感受到了无血统域模型的痛苦。如果我改变了另一个对象,那么在我的服务中,我必须执行以下操作:
我感觉我的代码变得越来越脆弱,而不是更加灵活。如果我添加一个新的表格,我需要去改变所有测试中的构造函数(我正在使用DI进行实现,所以这还不算太糟糕),但这似乎有点不妙。
有人有关于如何重构这种架构的建议吗?
我应该让我的仓库更具体化吗?服务抽象层是否有点过头了?
编辑:有一些很好的相关问题可以帮助:
- 仓储模式最佳实践 - 仓储模式帮助 - 架构难题
public void AddNewChild(ChildDto child, rootId)
{
var childEntity = Mapper.Map<ChildDto,ChildEntity>(child);
var rootEntity = _rootrepository.FindById(rootId);
rootEntity.Children.Add(childEntity);
_childRepository.SaveOrUpdate(child);
_rootRepository.SaveOrUpdate(root);
}
如果我不先保存孩子,NHibernate会抛出异常。我觉得我的通用仓储库(目前在一个服务中需要5个)不是正确的方法。
public Service(IRepository<ThingEntity> thingRepo, IRepository<RootEntity> rootRepo, IRepository<ChildEntity> childRepo, IRepository<CategoryEntity> catRepo, IRepository<ProductEntity> productRepo)
我感觉我的代码变得越来越脆弱,而不是更加灵活。如果我添加一个新的表格,我需要去改变所有测试中的构造函数(我正在使用DI进行实现,所以这还不算太糟糕),但这似乎有点不妙。
有人有关于如何重构这种架构的建议吗?
我应该让我的仓库更具体化吗?服务抽象层是否有点过头了?
编辑:有一些很好的相关问题可以帮助:
- 仓储模式最佳实践 - 仓储模式帮助 - 架构难题