实体类与LINQ to SQL提供程序分离,用于实现Repository模式.怎么样?

And*_*nea 9 provider design-patterns decouple repository-pattern linq-to-sql

我已经查看了Repository模式,并且我认识到我过去使用过的一些让我感觉良好的想法.

但是现在我想编写一个使用这种模式的应用程序,但是我想要从存储库提供程序中解密出来的实体类.

我会创建几个程序集:

  1. 一个"接口"程序集,它将托管包括IRepository接口在内的通用接口
  2. 一个"实体"程序集,它将托管实体类,如产品,用户,订单等.这个程序集将由"接口"程序集引用,因为某些方法会返回它们的类型或数组.它也将被主应用程序组件引用(例如Web应用程序)
  3. 一个或多个存储库提供程序程序集/程序集.每个都包含(至少)一个实现IRepository接口的类,它可以与某个Data Store一起使用.数据存储可以包括SQL Server,Oracle服务器,MySQL,XML文件,Web/WCF服务等.

在我发现生成的类和CustomDataContext类之间的深度依赖性之前,研究LINQ to SQL看起来非常有效,在实现所有这些方面所花费的时间.

如何在这种情况下使用LINQ to SQL?

Dan*_*ger 6

我不知道这是不是你想要的,但你可能想看看Rob Conery的MVC店面代码.他使用linq提供程序的存储库模式的变体.他将LINQ to Sql对象映射到域对象,然后将域对象从存储库提供程序返回到服务层,该服务层包装提供程序,允许他在返回到业务层之前返回的数据上使用某些逻辑.

MVC店面网络广播
代码

对我而言,听起来您希望提供程序返回DTO,然后您希望将DTO映射到存储库/服务层中的域对象.如果是这种情况,您可以将LINQ to SQL提供程序映射到DTO,让它返回它们,然后将DTO映射到存储库/服务层中的域对象.这应该工作得很好,但它可能会变得乏味,因为你现在有2个映射层.

在这种情况下,您将拥有:ProductService,它接受IProductRepository.它唤起了IProductRepository上的方法来取回你的DTO.然后,它将DTO映射到实际业务对象,并将它们返回给调用代码.


Mar*_*ade 5

您可以创建将数据库映射到任何类的外部XML文件:

 <?xml version="1.0" encoding="utf-8"?>
 <Database Name="DbName" 
           xmlns="http://schemas.microsoft.com/linqtosql/dbml/2007">
    <Table Name="DbTableName">
       <Type Name="EntityClassName" >
           <Column Name="ID" Type="System.Int64" Member="Id"
                   DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true"
                   CanBeNull="false" />
           <Column Name="ColumnName" Type="System.String" Member="PropertyA"
                   DbType="VarChar(1024)" CanBeNull="true" />
       </Type>
    </Table>
 </Database>
Run Code Online (Sandbox Code Playgroud)

然后将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<EntityClassName>()
               where entity.PropertyA = "..."
               select entity.ID;
     }
  }
Run Code Online (Sandbox Code Playgroud)