我正在阅读Sanderson的“Pro ASP.NET MVC框架”。 我对解耦实现感到困惑。
他在代码示例和存储库模式中使用LinqToSql与数据库进行交互。
[Table(Name = "Products")]
public class Product
{
[Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync=AutoSync.OnInsert)]
public int ProductID { get; set; }
[Column]
public string Name { get; set; }
[Column]
public string Description { get; set; }
[Column]
public decimal Price { get; set; }
[Column]
public string Category { get; set; }
}
public class SqlProductsRepository : IProductsRepository
{
private Table<Product> productsTable;
public SqlProductsRepository(string connectionString)
{
productsTable = (new DataContext(connectionString)).GetTable<Product>();
}
public IQueryable<Product> Products
{
get { return productsTable; }
}
}
SqlProductsRepository是dataLayer,因为它与数据库交互。 1.但它位于DomainModel项目中。也许这只是为了演示? 那么域逻辑在哪里呢?
2.我无法看到完全解耦,因为Products属性返回IQueryable。 是否假设如果我们更改组件,它必须包含Product类? 我似乎需要有一个带抽象的项目: 存储库接口,如IProductRepository和MappingClasses接口,如IProduct。 DataLayer组件必须实现这些abastractions。 是不是?
或许很难解释它,但是它通常如何在现场项目中工作?
答案 0 :(得分:2)
恕我直言,这一定是出于演示目的,因为它(在实际环境中)将层次结构分离并将这些不同的层保存在一个dll中是没有意义的。我刚才提出了一个正当理由。如果您希望多个应用程序在不立即访问数据层的情况下使用业务层,该怎么办?您必须仔细考虑数据层的访问修饰符,但这是可能的。
是否应该从数据层中公开IQueryable对象,这是自发布存储库模式以来一直在进行的讨论。并且有相当多的资源可以找到它。
列举一些: