我正在经历职业中期的哲学建筑危机。我看到了所谓的客户端代码(UI,Web服务,MVC,MVP等)与服务层之间的清晰界限。但是,从服务层返回的线路在每分钟都变得越来越模糊。这一切都始于使用Linq查询代码的能力以及延迟加载的概念。
我创建了一个包含契约(Contract)和实现的业务层。这样,实现可能会依赖于其他契约(Contract),依此类推。这是通过带有DI的IoC容器处理的。有一种服务可以处理DataAccess,它所做的就是返回UnitOfWork。终止时,此UnitOfWork创建一个事务,并在Commit方法上提交数据。 [View this Article (Testability and Entity Framework 4.0)]:
public interface IUnitOfWork : IDisposable {
IRepository<T> GetRepository<T>() where T : class;
void Commit();
}
该存储库是通用的,可与两个实现(EF4和InMemory数据存储)配合使用。 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;
}
}
现在,您将看到在使用复杂过滤器执行联接时查询如何变得更加复杂。
因此,我的问题是:
另外:我想得越多,也许第二个问题是唯一应该被问到的问题。
最佳答案
我认为回答问题的最佳方法是退后一步,考虑为什么建议将业务逻辑层和数据访问层分开。
在我看来,原因很简单:将业务逻辑与数据层分开,因为业务逻辑是值(value)所在,数据层和业务逻辑将需要或多或少地彼此独立地随时间变化,并且业务逻辑需要是可读的,而不必了解所有数据访问层的功能。
因此,针对您的查询体操的石蕊测试归结为:
关于c# - C#中的可查询性和延迟加载是否模糊了数据访问与业务逻辑之间的界限?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3817706/