2012-03-18 74 views
6

我正忙于阅读和享受.Net中的依赖注入。域逻辑与数据验证

我很难解释确切的背景,所以如果你熟悉这本书,请只打扰这个问题。

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

我正在使用Linq to SQL,并且我可以用Ling添加我的模型类到SQL属性,这样我就不必再有第二类了。例如。

[Table(Name="Customers")] 
public class Customer 
{ 
    [Column(IsPrimaryKey=true)] 
    public string CustomerID; 
    [Column] 
    public string City; 
} 

但是我觉得这是混合的关注,它会到SQL数据访问层效果紧密结合我的域名层到Linq的。你同意吗?

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

感谢,Daryn

回答

5

当然,耦合域层的DAL。更糟的是,您的域图层实体将具有与数据库中的表相同的结构。如果这些表是关系型的,那么这将不是域模型的最佳表示。

我们所做的是让DAL中存在Linq-to-SQL实体,然后我们在DAL中映射类将L2S实体转换为域实体,反之亦然。没关系,因为DAL真的是你的ORM,而且它的一部分工作就是做这个映射。

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

+0

这两个答案都非常相似,他们都帮助。这一个是第一个... – Daryn 2012-03-19 22:07:40

+1

@Daryn:如果两者都有帮助,你应该两个答案两个。 – jgauffin 2012-03-20 14:44:12

+0

没问题,我会投票给你 – Daryn 2012-03-20 19:31:40

6

但是我觉得这是混淆的担忧,它实际上将我的域层紧密地耦合到Linq到SQL数据访问层。你同意吗?

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

备注:域模型不应该具有属性的公有setter(在DDD中)。因为它有效地将模型逻辑移到模型之外。

我们假设我为域和数据访问层创建了两个'Customer'类。假设城市是必填字段。保存时,需要检查此规则。这应该在领域层还是数据访问层完成?

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

例子:

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); 
    } 
} 
+0

非常好,非常准确的回复。 – kamal 2012-03-27 08:27:51