在n层应用程序的上下文中,您认为数据访问类与存储库之间存在差异吗?
我倾向于认为是,但我只是想看看其他人的想法.我的想法是存储库的工作只是包含和执行原始查询本身,其中数据访问类将创建上下文,执行存储库(传递上下文),处理将数据模型映射到域模型并将结果返回…
你们有什么感想?您是否也看到Linq to XML场景中的任何变化(假设您更改了相关XDocument的上下文)?
干杯安东尼
更新:
这是我以前通常实现的方式:
public class TermBl : ITermBl { public IEnumerable<ITerm> GetAll(IListParameter criteria) { //Any pre business logic var dataLayer = this.CreateDataLayer(); var result = dataLayer.GetAll(criteria); //Any post business logic return result; } ... Other methods } public class TermDa : ITermDa { public IEnumerable<ITerm> GetAll(IListParameter criteria) { //Linq query var dataResult = ....ToList() var mappedResult = this.FromDataToDomain(dataResult); //Note the mapping isn't done in this object,the actual // mapping is handled by a separate component return mappedResult; } ... Other methods }
你是否看到了这种模式的固有问题……
至于我一直在考虑使用它的存储库,而不是直接在TermDa的GetAll方法中查询,我会改变它看起来像这样:
public class TermDa : ITermDa { public IEnumerable<ITerm> GetAll(IListParameter criteria) { var repository = this.CreateRepository(); var dataResult = repository.GetAll(...,criteria).ToList(); var mappedResult = this.FromDataToDomain(dataResult); return mappedResult; } ... Other methods } public class TermRepository : ITermRepository { public IQueryable<ITerm> GetAll(IMyContext context,IListParameter criteria) { //Linq query return ...; } ... Other queries }
这是你们看到它如何工作或者不是真的……无论有没有存储库,我都看到上述任何一个完全保护业务层不知道所使用的数据访问方法/技术…
解决方法
是的,存在重大差异.
> DAL(例如表数据网关)是数据库概念.它负责向数据库发出查询并返回记录集.
>存储库是域概念.它负责接受结构化请求并返回强类型对象.
在实践中非常不同.
更新:
这个问题似乎反映了很多混乱,所以让我试着用代码示例来澄清.如果您没有使用任何ORM并且正在进行所有自己的映射,那么这是您可能会使用的设计.这些都不是生产质量的代码,仅用于教育目的:
数据访问:
public interface IOrderData { IDataReader GetOrder(int orderID); } public interface IOrderDetailData { IDataReader GetOrderDetails(int orderID); } public interface IProductData { IDataReader GetProduct(int productID); }
域:
public class Order { public int ID { get; set; } public DateTime Date { get; set; } public OrderStatus Status { get; set; } // etc. public IList<OrderDetail> Details { get; set; } } public class OrderDetail { public int ID { get; set; } public Product Product { get; set; } public int Quantity { get; set; } }
制图:
public interface IDataMapper { Order MapOrder(IDataRecord record); OrderDetail MapOrderDetail(IDataRecord record); Product MapProduct(IDataRecord record); }
库:
public interface IOrderRepository { Order GetOrder(int orderID); } public class OrderRepository { // These get initialized in the constructor private readonly IOrderData orderData; private readonly IOrderDetailData orderDetailData; private readonly IProductData productData; private readonly IDataMapper mapper; public Order GetOrder(int orderID) { Order order; using (IDataReader orderReader = orderData.GetOrder(orderID)) { if (!orderReader.Read()) return null; order = mapper.MapOrder(orderReader); } using (IDataReader detailReader = orderDetailData.GetOrderDetails(orderID)) { while (detailReader.Read()) { OrderDetail detail = mapper.MapOrderDetail(detailReader); detail.Product = ...; // Omitted for brevity,more reading/mapping order.Details.Add(detail); } } return order; } }
这现在更有意义吗? DAL正在处理数据.具体的存储库可以封装数据访问类,但抽象存储库(它的公共接口)只处理域类.
我再次提醒读者,这甚至不接近生产质量的代码,并且今天大多数应用程序使用ORM或至少一些更好的自动映射形式.这仅用于说明目的.