Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Domain driven design 支持DbC的业务实体/价值对象框架_Domain Driven Design_Design By Contract - Fatal编程技术网

Domain driven design 支持DbC的业务实体/价值对象框架

Domain driven design 支持DbC的业务实体/价值对象框架,domain-driven-design,design-by-contract,Domain Driven Design,Design By Contract,我认为在构建业务模型时,我花费的时间最多的是验证业务实体,并确保实体对象及其关系保持良好的完整性。我对一个好的实体/价值对象框架的梦想将帮助我创建可重用的实体/价值对象,并像在数据库中一样轻松地为关系创建约束和规则,但因为我觉得这确实是业务规则,它们属于模型,应该完全独立于数据库 应该很容易定义Person对象的Name属性是必需的,Email属性是必需的,并且与某个正则表达式匹配,并且这些规则应该很容易重用f.ex。在验证我的web应用程序中的输入时 我在LINQtoSQL方面有着绝对丰富的经

我认为在构建业务模型时,我花费的时间最多的是验证业务实体,并确保实体对象及其关系保持良好的完整性。我对一个好的实体/价值对象框架的梦想将帮助我创建可重用的实体/价值对象,并像在数据库中一样轻松地为关系创建约束和规则,但因为我觉得这确实是业务规则,它们属于模型,应该完全独立于数据库

应该很容易定义Person对象的Name属性是必需的,Email属性是必需的,并且与某个正则表达式匹配,并且这些规则应该很容易重用f.ex。在验证我的web应用程序中的输入时

我在LINQtoSQL方面有着绝对丰富的经验,尽管使用LINQtoSQL当然很好,但它也有不支持值对象和其他对象的局限性。我的问题是Entity framework或NHibernate是否更适合我,或者是否有其他技术更适合我的需要?

有一次会议向我简要介绍了DDD概念。尽管这本书是以ASP.NET MVC为预览版的,但他确实把MVC中的“M”作为一个真实而纯粹的领域模型来关注——几乎使用了关于建模方法的书的1/2(我非常喜欢这本书)。他接触的一件事是在聚合根的上下文中使用值对象(显然)。但是,他也展示了如何使用Linq来表示实体以及值对象

关键是,他指出了Linq的局限性,即它必须在每个对象上都有一个标识,包括值对象。他承认这打破了纯领域模型方法;但是,这是让它与LINQtoSQL一起工作的唯一方法

他的工作是给你的价值对象一个身份;但是,将该标识设置为内部标识,这样它就不会暴露在模型之外。这将允许您使用存储库中的Linq链接和共享您的对象;虽然没有将其公开给客户机层—因此,就好像它们是独占的值对象

我认为实体框架也有同样的要求

下面是一个C#示例

public class MyEntity
{
  [Column(IsPrimaryKey = true
    , IsDbGenerated = true
    , AutoSync = AutoSync.OnInsert)]
  public int EntityID { get; set; }

  [Column(CanBeNull = false)]
  public string EntityProperty
  {
    get
    {
      // insert business rules here, if need be
    }
    set;
  }
}

public class MyValueObjectForMyEntity
{
  // make your identity internal
  [Column(IsPrimaryKey = true
    , IsDbGenerated = true
    , AutoSync = AutoSync.OnInsert)]
  internal int ValueObjectID { get; set; }

  // everything else public
  [Column(CanBeNull = false)]
  public string MyProperty { get; set; }
}
有一次会议向我简要介绍了DDD的概念。尽管这本书是以ASP.NET MVC为预览版的,但他确实把MVC中的“M”作为一个真实而纯粹的领域模型来关注——几乎使用了关于建模方法的书的1/2(我非常喜欢这本书)。他接触的一件事是在聚合根的上下文中使用值对象(显然)。但是,他也展示了如何使用Linq来表示实体以及值对象

关键是,他指出了Linq的局限性,即它必须在每个对象上都有一个标识,包括值对象。他承认这打破了纯领域模型方法;但是,这是让它与LINQtoSQL一起工作的唯一方法

他的工作是给你的价值对象一个身份;但是,将该标识设置为内部标识,这样它就不会暴露在模型之外。这将允许您使用存储库中的Linq链接和共享您的对象;虽然没有将其公开给客户机层—因此,就好像它们是独占的值对象

我认为实体框架也有同样的要求

下面是一个C#示例

public class MyEntity
{
  [Column(IsPrimaryKey = true
    , IsDbGenerated = true
    , AutoSync = AutoSync.OnInsert)]
  public int EntityID { get; set; }

  [Column(CanBeNull = false)]
  public string EntityProperty
  {
    get
    {
      // insert business rules here, if need be
    }
    set;
  }
}

public class MyValueObjectForMyEntity
{
  // make your identity internal
  [Column(IsPrimaryKey = true
    , IsDbGenerated = true
    , AutoSync = AutoSync.OnInsert)]
  internal int ValueObjectID { get; set; }

  // everything else public
  [Column(CanBeNull = false)]
  public string MyProperty { get; set; }
}

尽管看起来你站在.Net这一边,我还是强烈推荐Eric Evans的书《域驱动设计》。(事实上,UML比Java更多,这些想法应该可以移植。)


这是一本模式书,但他提出了许多设计策略,主张将所有的对象规则逻辑(“不变量”)粘贴到一个集中的域中;然后,他继续对一些普遍理解的模式进行反复讨论,使像你这样的问题看起来更容易处理。好吧,如果不易处理,至少从长远来看更易于管理。

即使看起来你站在.Net这一边,我还是强烈推荐Eric Evans的书《域驱动设计》。(事实上,UML比Java更多,这些想法应该可以移植。)

这是一本模式书,但他提出了许多设计策略,主张将所有的对象规则逻辑(“不变量”)粘贴到一个集中的域中;然后,他继续对一些普遍理解的模式进行反复讨论,使像你这样的问题看起来更容易处理。好吧,如果不易处理,至少从长远来看更易于管理