Linq to sql 域中定义的规范模式

Linq to sql 域中定义的规范模式,linq-to-sql,domain-driven-design,specification-pattern,Linq To Sql,Domain Driven Design,Specification Pattern,使用Linq to SQL和DDD风格的域层以及解耦合存储库,是否有人对如何在不将L2S问题泄漏到域层的情况下实现应用程序有什么好的想法,这仍然是可以理解的?:) 我们在选择一组事务数据时有复杂的业务逻辑,希望这些规则/规范归域所有。我们在保持我们的域持久性方面也做得很好 这带来了一个问题,因为为了实现规范,域(据我所知)需要查看被查询的类型(L2S类型) 有什么想法吗 此外,由于我不想解释的原因,nHibernate是不可能的:) Linq To Sql类可以是部分类。这意味着您可以通过实现实

使用Linq to SQL和DDD风格的域层以及解耦合存储库,是否有人对如何在不将L2S问题泄漏到域层的情况下实现应用程序有什么好的想法,这仍然是可以理解的?:)

我们在选择一组事务数据时有复杂的业务逻辑,希望这些规则/规范归域所有。我们在保持我们的域持久性方面也做得很好

这带来了一个问题,因为为了实现规范,域(据我所知)需要查看被查询的类型(L2S类型)

有什么想法吗


此外,由于我不想解释的原因,nHibernate是不可能的:)

Linq To Sql类可以是部分类。这意味着您可以通过实现实现公共接口的分部来扩展它们。该接口可以在层之间共享,而不会出现您所描述的“出血”问题。剩下的只是“IsStatisFinedby”的详细信息,应该很容易封装。

我最近也遇到了同样的问题。不同的模式,但仍然是LINQ到SQL(L2S)。我尝试了两种不同的方法来避免泄漏

首先,我们尝试使用DTO和映射层。所以我们编写了超级简单的对象,它们与表之间有一对一的映射。它们都装饰有L2S属性。然后,我们编写了一个映射层,将DTO映射到我们的业务对象。所有这些都是通过Doman驱动的设计中的存储库模式隐藏的。因此,business objects的消费者根本不知道L2是隐藏的

其次,主要是为了多样性。我们尝试使用L2S的XML映射特性,因此对象本身不需要属性。对于集合,我们公开了IEnumerable,而不是任何L2S集合。如果查看业务类的内部结构,您仍然可以检测到L2S(EntitySet或Ref)的一些用法。但这一阶层的消费者对此一无所知。所以有一些泄漏,但没有什么严重的

最后我们坚持第一种模式。第二种方法很有效,我们可以在不改变业务层接口的情况下替换L2S,但我对XML映射从来都不满意。第一种模式在数据库和业务对象之间有了更清晰的分离。这需要更多的代码。第一种方法对我们也更有效,因为它允许我们以不同于表的方式发展业务对象。在项目的早期,xml映射是有效的,因为我们的对象与表几乎是一对一的


最后我们在L2S和磁畴之间加了一层。成功了。它需要更多的代码,但它确实很简单。这一切都是非常可测试的。

如果您想避免从域层引用Linq2Sql,您必须使用表示实体的接口,而不是使用实际实体本身。然后,需要在接口和实体之间建立映射层


我以这种方式工作,发现这是一个严重的障碍。对于新项目,我转而使用NHibernate,对于旧项目,我不再担心直接引用Linq2Sql实体的域。在我看来,克服这一限制需要花费太多的时间。

您是否考虑过将通用规范映射到一个
表达式
树中,以转换为正确的L2S语法?这似乎是你在这里遇到的主要问题。规范模式不是问题所在,但到L2S的映射是问题所在。

我解决了L2S泄漏的问题,但现在的问题是如何让我的域对象拥有自己的规范(如规范模式中的规范),而不必从我的域层引用L2S。我想我看不到您的确切位置。我们使用我提到的第一种技术来保持我们的域和L2之间的距离,我们使用的是规范模式。我们的规范作用于域对象,我们有DDD风格的服务来获取规范。多亏了映射层,如果这些规范需要来自数据库的参数,那么它们都隐藏在映射层后面。我们目前在一个单独的程序集中拥有我们的域,L2S隐藏在存储库实现后面。域程序集根本没有对datacontext或任何L2的引用。因此,我们在那里取得了成功。我可能错误地考虑了规范模式,但我试图将规范传递给存储库,但域层拥有这些规范。L2S创建自己的类型,所以为了编写规范,我必须引用这些类型,这会将这些问题泄漏到我的域中。听起来nHibernate会解决这个问题的可能是