它们是一样的吗?刚看完Rob Connery的Storefront教程,它们似乎是类似的技术。我的意思是,当我实现DAL对象时,我具有GetStuff,Add / Delete等方法,并且总是先编写接口,以便以后可以切换db。
我会感到困惑吗?
它们是一样的吗?刚看完Rob Connery的Storefront教程,它们似乎是类似的技术。我的意思是,当我实现DAL对象时,我具有GetStuff,Add / Delete等方法,并且总是先编写接口,以便以后可以切换db。
我会感到困惑吗?
Answers:
您绝对不是混淆事物的人。:-)
我认为问题的答案取决于您希望成为一名纯粹主义者。
如果您想要严格的DDD观点,那将带您走一条路。如果您将存储库看作是一种模式,可以帮助我们标准化将服务和数据库之间分开的层的接口,则会使您失望。
从我的角度来看,存储库只是一个明确指定的数据访问层,换句话说就是实现数据访问层的标准化方法。不同的存储库实现之间存在一些差异,但是概念是相同的。
有些人将对存储库施加更多的DDD约束,而另一些人则将存储库用作数据库和服务层之间的便捷中介。像DAL这样的存储库将服务层与数据访问细节隔离开来。
使它们与众不同的一个实现问题是,通常使用采用规范的方法来创建存储库。存储库将返回满足该规范的数据。我所见过的大多数传统DAL将拥有更多的方法集,其中该方法将采用任意数量的参数。尽管这听起来似乎很小的差异,但是当您进入Linq和Expressions的领域时,这是一个大问题。我们的默认存储库界面如下所示:
public interface IRepository : IDisposable
{
T[] GetAll<T>();
T[] GetAll<T>(Expression<Func<T, bool>> filter);
T GetSingle<T>(Expression<Func<T, bool>> filter);
T GetSingle<T>(Expression<Func<T, bool>> filter, List<Expression<Func<T, object>>> subSelectors);
void Delete<T>(T entity);
void Add<T>(T entity);
int SaveChanges();
DbTransaction BeginTransaction();
}
这是DAL还是存储库?在这种情况下,我猜两者都有。
金
存储库是一种可以以多种不同方式应用的模式,而数据访问层的职责非常明确:DAL必须知道如何连接到数据存储以执行CRUD操作。
存储库可以是DAL,但它也可以位于DAL的前面,并充当业务对象层和数据层之间的桥梁。使用哪种实现会因项目而异。
一个很大的不同是,DAO是处理域中任何实体的持久性的通用方法。另一方面,存储库仅处理聚合根。
我一直在寻找类似问题的答案,并同意排名最高的两个答案。试图为自己澄清这一点,我发现,如果将规范与存储库模式紧密结合的规范实现为域模型的一流成员,那么我可以
我什至可以说,除非将Repository模式与Specification模式一起使用,否则它并不是真正的“ Repository”,而是DAL。用伪代码伪造的示例:
specification100 = new AccountHasMoreOrdersThan(100)
specification200 = new AccountHasMoreOrdersThan(200)
assert that specification200.isSpecialCaseOf(specification100)
specificationAge = new AccountIsOlderThan('2000-01-01')
combinedSpec = new CompositeSpecification(
SpecificationOperator.And, specification200, specificationAge)
for each account in Repository<Account>.GetAllSatisfying(combinedSpec)
assert that account.Created < '2000-01-01'
assert that account.Orders.Count > 200
参见福勒的规范论文详细信息,(这就是我上面所基于的内容)。
DAL将具有专门的方法,例如
IoCManager.InstanceFor<IAccountDAO>()
.GetAccountsWithAtLeastOrdersAndCreatedBefore(200, '2000-01-01')
您可以看到这很快变得很麻烦,特别是因为您必须使用这种方法定义每个DAL / DAO接口,并且实现DAL查询方法。
在.NET中,LINQ查询可以是实现规范的一种方法,但是结合使用规范(表达式)可能不像使用本地解决方案那样平滑。有关此问题的一些想法在本SO问题中进行了描述。
我个人认为这全都与映射有关,请参阅:http : //www.martinfowler.com/eaaCatalog/repository.html。因此,存储库的输出/输入是域对象,在DAL上可以是任何对象。对我来说,这是一个重要的添加/限制,因为您可以为数据库/服务/使用不同布局的任何内容添加存储库实现,并且您有明确的位置可以专注于进行映射。如果您不使用该限制并在其他位置使用映射,那么采用不同的方式表示数据可能会影响不应更改的代码。
因此,在大多数(简单)情况下,DAO是存储库的实现吗?
据我了解,似乎DAO精确地处理了数据库访问(CRUD-是否没有选择?!),而存储库允许您抽象整个数据访问,也许是多个DAO(可能是不同数据源)的基础。
我在正确的道路上吗?
在外部世界(即客户端代码)中,存储库与DAL相同,除了:
(1)它的插入/更新/删除方法仅限于以数据容器对象作为参数。
(2)对于读取操作,它可以采用简单的规范,例如DAL(例如GetByPK)或高级规范。
在内部,它与数据映射器层(例如,实体框架上下文等)一起执行实际的CRUD操作。
存储库模式不代表什么:-
此外,我已经看到人们经常感到困惑,除了将Insert / Update / Delete方法提交到数据库的所有内存中更改之外,还有一种单独的Save方法作为存储库模式示例实现。我们肯定可以在存储库中使用Save方法,但这不是存储库负责隔离内存中的CUD(创建,更新,删除)和持久性方法(在数据库中执行实际的写/更改操作)的职责,而是工作单位模式的责任。
希望这可以帮助!