C# 域逻辑与数据验证

C# 域逻辑与数据验证,c#,linq,architecture,domain-driven-design,entity,C#,Linq,Architecture,Domain Driven Design,Entity,我正忙于阅读和享受MarkSeemann的.Net中的依赖注入 我很难解释确切的上下文,所以如果你熟悉这本书的话,请只回答这个问题 我的问题与第2章第49页中的两个产品类有关。一个在域层,一个在数据访问层。说明了数据访问层中的产品类是由Linq to Entity向导创建的 我正在使用LINQtoSQL,并且我可以用LINgtoSQL属性装饰我的模型类,这样我就不必有第二个类。例如 [Table(Name="Customers")] public class Customer { [Colu

我正忙于阅读和享受MarkSeemann的.Net中的依赖注入

我很难解释确切的上下文,所以如果你熟悉这本书的话,请只回答这个问题

我的问题与第2章第49页中的两个产品类有关。一个在域层,一个在数据访问层。说明了数据访问层中的产品类是由Linq to Entity向导创建的

我正在使用LINQtoSQL,并且我可以用LINgtoSQL属性装饰我的模型类,这样我就不必有第二个类。例如

[Table(Name="Customers")]
public class Customer
{
  [Column(IsPrimaryKey=true)]
  public string CustomerID;
  [Column]
  public string City;
}
然而,我觉得这是一个复杂的问题,它实际上会将我的域层与Linq到SQL数据访问层紧密耦合。你同意这一点吗

假设我为域和数据访问层创建了两个“客户”类。假设城市是必填字段。保存时,需要检查此规则。这应该在域层或数据访问层中完成,还是同时在两者中完成


非常感谢,Daryn,这将您的域层与DAL连接起来。更糟糕的是,域层实体的结构将与数据库中的表相同。如果这些表是关系表,那么这将不是域模型的最佳表示

我们要做的是让Linq到SQL实体存在于DAL中,然后在DAL中使用映射类将L2S实体转换为域实体,反之亦然。这没关系,因为DAL实际上是你的ORM,它的部分工作就是做这个映射

我想说,如果需要City作为业务规则,那么这就是业务逻辑,属于业务逻辑层中的业务规则。有一些验证包可以帮助解决这个问题

然而,我觉得这是一个复杂的问题,它实际上会将我的域层与Linq到SQL数据访问层紧密耦合。你同意这一点吗

是的,会的。实体框架(代码优先)和nhibernate都可以使用单独的映射类,这将使您的模型干净,而不依赖于OR/M

旁注:域模型不应该有属性的公共设置器(在DDD中)。因为它有效地将模型逻辑移动到模型之外

假设我为域和数据访问层创建了两个“客户”类。假设城市是必填字段。保存时,需要检查此规则。这应该在域层或数据访问层中完成,还是同时在两者中完成

数据库实体应该只存在于存储库类中,因此不必验证它。正在保存的域模型应该已经具有正确的状态

示例:

public class ArticleRepository
{
    public void Save(Article article)
    {
        // Article is already in a correct state
        // (thanks to no public setters)

        var dbEntity = new ArticleEntity();
        Mapper.Map(article, dbEntity);
        _dbContext.Save(dbEntity);
    }
}