And*_*nea 9 provider design-patterns decouple repository-pattern linq-to-sql
我已经查看了Repository模式,并且我认识到我过去使用过的一些让我感觉良好的想法.
但是现在我想编写一个使用这种模式的应用程序,但是我想要从存储库提供程序中解密出来的实体类.
我会创建几个程序集:
在我发现生成的类和CustomDataContext类之间的深度依赖性之前,研究LINQ to SQL看起来非常有效,在实现所有这些方面所花费的时间.
如何在这种情况下使用LINQ to SQL?
我不知道这是不是你想要的,但你可能想看看Rob Conery的MVC店面代码.他使用linq提供程序的存储库模式的变体.他将LINQ to Sql对象映射到域对象,然后将域对象从存储库提供程序返回到服务层,该服务层包装提供程序,允许他在返回到业务层之前返回的数据上使用某些逻辑.
对我而言,听起来您希望提供程序返回DTO,然后您希望将DTO映射到存储库/服务层中的域对象.如果是这种情况,您可以将LINQ to SQL提供程序映射到DTO,让它返回它们,然后将DTO映射到存储库/服务层中的域对象.这应该工作得很好,但它可能会变得乏味,因为你现在有2个映射层.
在这种情况下,您将拥有:ProductService,它接受IProductRepository.它唤起了IProductRepository上的方法来取回你的DTO.然后,它将DTO映射到实际业务对象,并将它们返回给调用代码.
您可以创建将数据库映射到任何类的外部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)