在领域模型或数据访问层中执行数据库特定类型

本文关键字:数据库 执行数 类型 执行 领域模型 数据 访问 | 更新日期: 2023-09-27 18:12:38

我在领域模型中定义了客户、订单等实体。

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

现在我想知道我是否应该在领域模型或数据访问层定义IRepository ?我猜SQLRepository和CacheRepository需要去DAL,但IRepository去那里了吗?

此外,例如,我的Repository从Customer表返回一个客户列表,我对如何设计这个有点困惑,似乎我最终在DAL和域模型中重复类型。请看下面的例子:

在应用程序中,我想做这样的事情:

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

So In my Domain:

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

In my DAL:

class SqlRepository:IRepository
{
   public CustomerTable Customers;
}
class CustomerTable 
{
   public List<Customer> list();
}

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

*更新

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

在领域模型或数据访问层中执行数据库特定类型

以下信息是针对另一个问题的,它向您展示了一个简单的项目结构:将Model放置在单独的程序集中

我的观点是IRepository接口应该在你的DataLayer项目中是公共的。实现可以是私有的(使用工厂或依赖注入将它们加载到其他项目中),您创建的领域模型可以由业务层和数据层共享。

一种选择是将类型放入由业务层和数据层引用的单独的公共或类型程序集中。注意限制进入该程序集的内容,以免引入不必要的耦合。

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