Domain driven design 支持DbC的业务实体/价值对象框架
我认为在构建业务模型时,我花费的时间最多的是验证业务实体,并确保实体对象及其关系保持良好的完整性。我对一个好的实体/价值对象框架的梦想将帮助我创建可重用的实体/价值对象,并像在数据库中一样轻松地为关系创建约束和规则,但因为我觉得这确实是业务规则,它们属于模型,应该完全独立于数据库 应该很容易定义Person对象的Name属性是必需的,Email属性是必需的,并且与某个正则表达式匹配,并且这些规则应该很容易重用f.ex。在验证我的web应用程序中的输入时 我在LINQtoSQL方面有着绝对丰富的经验,尽管使用LINQtoSQL当然很好,但它也有不支持值对象和其他对象的局限性。我的问题是Entity framework或NHibernate是否更适合我,或者是否有其他技术更适合我的需要?有一次会议向我简要介绍了DDD概念。尽管这本书是以ASP.NET MVC为预览版的,但他确实把MVC中的“M”作为一个真实而纯粹的领域模型来关注——几乎使用了关于建模方法的书的1/2(我非常喜欢这本书)。他接触的一件事是在聚合根的上下文中使用值对象(显然)。但是,他也展示了如何使用Linq来表示实体以及值对象 关键是,他指出了Linq的局限性,即它必须在每个对象上都有一个标识,包括值对象。他承认这打破了纯领域模型方法;但是,这是让它与LINQtoSQL一起工作的唯一方法 他的工作是给你的价值对象一个身份;但是,将该标识设置为内部标识,这样它就不会暴露在模型之外。这将允许您使用存储库中的Linq链接和共享您的对象;虽然没有将其公开给客户机层—因此,就好像它们是独占的值对象 我认为实体框架也有同样的要求 下面是一个C#示例Domain driven design 支持DbC的业务实体/价值对象框架,domain-driven-design,design-by-contract,Domain Driven Design,Design By Contract,我认为在构建业务模型时,我花费的时间最多的是验证业务实体,并确保实体对象及其关系保持良好的完整性。我对一个好的实体/价值对象框架的梦想将帮助我创建可重用的实体/价值对象,并像在数据库中一样轻松地为关系创建约束和规则,但因为我觉得这确实是业务规则,它们属于模型,应该完全独立于数据库 应该很容易定义Person对象的Name属性是必需的,Email属性是必需的,并且与某个正则表达式匹配,并且这些规则应该很容易重用f.ex。在验证我的web应用程序中的输入时 我在LINQtoSQL方面有着绝对丰富的经
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更多,这些想法应该可以移植。) 这是一本模式书,但他提出了许多设计策略,主张将所有的对象规则逻辑(“不变量”)粘贴到一个集中的域中;然后,他继续对一些普遍理解的模式进行反复讨论,使像你这样的问题看起来更容易处理。好吧,如果不易处理,至少从长远来看更易于管理