松散耦合的发展

时间:2010-12-09 07:40:38

标签: model-view-controller architecture repository-pattern

我正在阅读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。 是不是?

或许很难解释它,但是它通常如何在现场项目中工作?

1 个答案:

答案 0 :(得分:2)

  1. 恕我直言,这一定是出于演示目的,因为它(在实际环境中)将层次结构分离并将这些不同的层保存在一个dll中是没有意义的。我刚才提出了一个正当理由。如果您希望多个应用程序在不立即访问数据层的情况下使用业务层,该怎么办?您必须仔细考虑数据层的访问修饰符,但这是可能的。

  2. 是否应该从数据层中公开IQueryable对象,这是自发布存储库模式以来一直在进行的讨论。并且有相当多的资源可以找到它。

  3. 列举一些: