linq – 存储库与数据访问
|
在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或至少一些更好的自动映射形式.这仅用于说明目的. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- sql-server – DB中用于生成主键的表?
- SQL Server 学会sql数据库关系图(Petshop)
- SQL Server distinct 多列问题结合group by的解决
- sql-server – SQL Server:为什么GUID的第15个c
- sql-server – 无论如何为“SELECT”语句创建SQL
- SQL Server SQL效率提升之一些SQL编写建议并有效
- sql-server – 如果包含停用词,即使停用词列表为
- SQL Server 2000数据库的备份文件恢复到Sql2005的
- 查询问题 – 在sql导航器中运行查询时返回行,但不
- sql – 在两个varchar字段上创建Unqiue不区分大小
