基于经典三层的项目:UI(在这个问题中并不重要)、业务逻辑层和数据访问层。我有几个表:客户
产品
订单
用户
。设计应该是:
//DAL methods
public IEnumerable<Customer> GetAllCustomers()
public IEnumerable<Product> GetAllProducts()
public IEnumerable<Order> GetAllOrders()
public IEnumerable<User> GetAllUsers()
//BLL methods
public IEnumerable<Order> GetOrders(long CustomerID)
public IEnumerable<Product> GetProducts(long CustomerID)
public IEnumerable<Product> GetProducts(long OrderID)
令我困惑的是,我发现DAL中的所有方法都是GetAllXXXX。我不得不承认这个设计效果很好。在 DAL 中,只有 GetAll 方法。在 BLL 中,除了 GetAll 方法的组合操作(过滤/连接/选择)之外什么都没有。很奇怪吗?正确的做法是什么?
最佳答案
不,这并不奇怪,事实上,这与我的做法非常相似。
对我来说唯一的区别是:
- 我使用
IQueryable<T>
而不是IEnumerable<T>
(获得延迟执行) - 我有一个通用存储库(
Repository<T>
):-
IQueryable<T> Find()
-
void Add(T)
- 等等等等
-
这样,我的存储库就保持干净/简单。
所以你的 BLL 可以这样实现:
public IEnumerable<Order> GetOrders(long CustomerID)
{
Repository<Order> orderRepository = new Repository<Order>(); // should use DI here, but i digress
return orderRepository
.Find() // no query executed...
.Where(o => o.CustomerID == CustomerID) // still nothing...
.ToList(); // query executed, with BL applied! cool!
}
使 BLL 执行投影/工作/逻辑。存储库只处理 T 的持久性,不关心实际类型或任何业务逻辑。
反正我就是这么做的。
关于c# - 数据访问层(DAL)中的LINQ查询方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4084128/