vdh*_*ant 8 linq linq-to-xml repository-pattern linq-to-sql
在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
}
Run Code Online (Sandbox Code Playgroud)
你是否看到了这种模式的固有问题......
至于我一直在考虑使用它的存储库,而不是直接在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
}
Run Code Online (Sandbox Code Playgroud)
这是你们看到它如何工作或者不是真的...无论有没有存储库,我都看到上述任何一个完全保护业务层不了解所使用的数据访问方法/技术...
是的,存在重大差异.
甲DAL(如表数据网关)是一个数据库的概念.它负责向数据库发出查询并返回记录集.
一个库是一个域的概念.它负责接受结构化请求并返回强类型对象.
在实践中非常不同.
更新:
这个问题似乎反映了很多混乱,所以让我试着用代码示例来澄清.如果您没有使用任何ORM并且正在执行所有自己的映射,那么这是您可能使用的设计.这些都不是生产质量的代码,仅用于教育目的:
数据访问:
public interface IOrderData
{
IDataReader GetOrder(int orderID);
}
public interface IOrderDetailData
{
IDataReader GetOrderDetails(int orderID);
}
public interface IProductData
{
IDataReader GetProduct(int productID);
}
Run Code Online (Sandbox Code Playgroud)
域:
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; }
}
Run Code Online (Sandbox Code Playgroud)
制图:
public interface IDataMapper
{
Order MapOrder(IDataRecord record);
OrderDetail MapOrderDetail(IDataRecord record);
Product MapProduct(IDataRecord record);
}
Run Code Online (Sandbox Code Playgroud)
库:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
这现在更有意义吗?DAL正在处理数据.具体的存储库可以封装数据访问类,但抽象存储库(它的公共接口)只处理域类.
我再次提醒读者,这甚至不接近生产质量的代码,并且今天大多数应用程序使用ORM或至少一些更好的自动映射形式.这仅用于说明目的.