我已经查看了Repository模式,并且我认识到我过去使用过的一些让我感觉良好的想法.
但是现在我想编写一个使用这种模式的应用程序,但是我想要从存储库提供程序中解密出来的实体类.
我会创建几个程序集:
一个"接口"程序集,它将托管包括IRepository接口在内的通用接口
一个"实体"程序集,它将托管实体类,如产品,用户,订单等.这个程序集将由"接口"程序集引用,因为某些方法会返回它们的类型或数组.它也将被主应用程序组件引用(例如Web应用程序)
一个或多个存储库提供程序程序集/程序集.每个都包含(至少)一个实现IRepository接口的类,它可以与某个Data Store一起使用.数据存储可以包括SQL Server,Oracle服务器,MySQL,XML文件,Web/WCF服务等.
在我发现生成的类和CustomDataContext类之间的深度依赖性之前,研究LINQ to SQL看起来非常有效,在实现所有这些方面所花费的时间.
如何在这种情况下使用LINQ to SQL?
我不知道这是不是你想要的,但你可能想看看Rob Conery的MVC店面代码.他使用linq提供程序的存储库模式的变体.他将LINQ to Sql对象映射到域对象,然后将域对象从存储库提供程序返回到服务层,该服务层包装提供程序,允许他在返回到业务层之前返回的数据上使用某些逻辑.
MVC店面网络广播
代码
对我而言,听起来您希望提供程序返回DTO,然后您希望将DTO映射到存储库/服务层中的域对象.如果是这种情况,您可以将LINQ to SQL提供程序映射到DTO,让它返回它们,然后将DTO映射到存储库/服务层中的域对象.这应该工作得很好,但它可能会变得乏味,因为你现在有2个映射层.
在这种情况下,您将拥有:ProductService,它接受IProductRepository.它唤起了IProductRepository上的方法来取回你的DTO.然后,它将DTO映射到实际业务对象,并将它们返回给调用代码.
您可以创建将数据库映射到任何类的外部XML文件:
然后将XML传递给DataContext类:
using (var cn = GetDbConnection()) { var mappingSrc = XmlMappingSource.FromReader(xmlReader); using (var db = new DataContext(cn, mappingSrc)) { var q = from entity in db.GetTable() where entity.PropertyA = "..." select entity.ID; } }