我正在经历一场职业生涯中期的哲学建筑危机。我看到客户端代码(UI、Web 服务、MVC、MVP 等)和服务层之间的界限非常清晰。然而,从服务层回来的界限越来越模糊。这一切都始于使用 Linq 查询代码的能力和延迟加载的概念。
我创建了一个由合同和实施组成的业务层。然后,实现可以依赖于其他合同等。这是通过带有 DI 的 IoC 容器处理的。有一个服务可以处理 DataAccess,它所做的只是返回一个 UnitOfWork。这个 UnitOfWork 在扩展时创建一个事务,并在 Commit 方法上提交数据。[查看本文(可测试性和实体框架 4.0) ]:
public interface IUnitOfWork : IDisposable {
IRepository<T> GetRepository<T>() where T : class;
void Commit();
}
Repository 是通用的,适用于两种实现(EF4 和 InMemory DataStore)。T 由从数据库架构或 EF4 映射生成的 POCO 组成。可测试性内置于存储库设计中。我们可以利用内存中的实现来断言具有预期的结果。
public interface IRepository<T> where T : class {
IQueryable<T> Table { get; }
void Add(T entity);
void Remove(T entity);
}
虽然数据源是抽象的,但 IQueryable 仍然使我能够在业务逻辑中的任何位置创建查询。这是一个例子。
public interface IFoo {
Bar[] GetAll();
}
public class FooImpl : IFoo {
IDataAccess _dataAccess;
public FooImpl(IDataAccess dataAccess) {
_dataAccess = dataAccess;
}
public Bar[] GetAll() {
Bar[] output;
using (var work = _dataAccess.DoWork()) {
output = work.GetRepository<Bar>().Table.ToArray();
}
return output;
}
}
现在您可以看到当您使用复杂的过滤器执行连接时,查询如何变得更加复杂。
因此,我的问题是:
- BLL 和 DAL 之间没有明确的区别是否重要?.
- 在类似于 InMemory 抽象的 Repository 层后面时,可查询性是否被视为数据访问或业务逻辑?
补充:我想得越多,也许第二个问题是唯一应该问的问题。