特定于数据库的类型是否属于域模型或数据访问层?

时间:2011-10-26 03:51:09

标签: c# java domain-driven-design

我的域模型中定义了客户,订单等实体。

现在我想定义一个名为IRepository的接口来表示我的持久层,我将进一步拥有实现IRepository的SQLRepository,CacheRepository。

现在我想知道我是否应该在域模型或数据访问层中定义IRepository?我想SQLRepository和CacheRepository需要进入DAL,但IRepository也会进入那里吗?

此外,例如我的Repository从Customer表返回一个Customers列表,我对如何设计它有点困惑,似乎我最终在DAL和Domain Model中重复了类型。见下面的例子:

在应用程序中,我想做类似的事情:

var repository = new SQLRepository();

//Below repository.customers represents customer table
List<Customer> customers = repository.Customers.list();

所以在我的网域中:

class Customer
{
  public int id;
  public string name;
}

在我的DAL中:

class SqlRepository:IRepository
{
   public CustomerTable Customers;
}

class CustomerTable 
{
   public List<Customer> list();
}

我想知道是否有更好的方法来设计这些图层?

*更新

我已经在不同的类库/程序集中定义了DAL和Domain。最初我以为我会像Customer这样的POCO实体代表数据库表中的一条记录,但是然后在哪里声明Customer.Add(客户)?它会进入DAL吗?我不想在DAL中使用业务规则,如果我开始在我的实体中添加方法,它们就会变得复杂,其中包含持久性逻辑和业务逻辑。

2 个答案:

答案 0 :(得分:0)

一种选择是将您的类型放入由业务层和数据层引用的单独的公共或类型程序集中。小心限制组件中的内容,这样就不会引入不必要的耦合。

将常量放入由sql层(预处理),业务逻辑层和对象模型共享的公共程序集中的方法类似...

答案 1 :(得分:0)

以下信息针对另一个问题,它向您展示了一个简单的项目结构:Placing Model in separate assembly

我的观点是,在您的DataLayer项目中,IRepository接口应该是公共的。这些实现可以是私有的(使用Factory或Dependency Injection将它们加载到其他项目中),您创建的Domain Model可以由业务层和数据层共享。