entity framework规范模式实现

如何使用entity framework实现规范模式?

  1. 规格图案:
    对于那些想要入门的人,请访问此链接

  2. 理解entity framework规范:
    这个 。 这包括以下非常重要的几点。 在任何类型的真实世界应用程序中,您很快就会想要将多个规范链接在一起。 这被称为组成规范。 您将需要掌握Linq to Entities中解决规范组合的一些注意事项。 您需要知道这一点,因为使用Linq to Entities是表达规范满意度标准的理想方法。

  3. 修复坏处:
    下载并安装 。 它解决了Linq对您在第二步中阅读的实体的缺点。 解释了修复程序实现的更多细节。

  4. 实施它!
    您应该有足够的信息来实现模式。 保持谷歌搜索。 为EF做这件事并不是很简单,但值得付出努力。 是一个非常有趣的实现。

基本上,在实现规范模式时应该没有什么特别的(由于EF)。 您将规范实现为单独的类,这些类适用于您的域模型。

您可以找到很多关于规范模式的文章或网络广播 ,甚至还有一些使用EF的文章或网络广播 ,例如此处和此处 。

您可能已经知道,规范模式将使您能够将filter发送到您的存储库(以及其他用法)。 我已经看到很多实现这样做。

通常,人们在规范接口上公开另一个方法,表示必须发送到Entity Framework的表达式树:

public interface ISpecification { bool IsSpecifiedBy(T item); Expression> GetPredicate() } 

存储库将调用GetPredicate方法并将其传递给EF的DbSet上的Where方法。 这样你就可以限制生成哪些表达式,并保证它会生成一个有效的SQL语句。

要在规范上启用布尔运算符,您需要将表达式混合在一起。 有一篇来自Vladmir Khorikov的post ,他在那里详细解释了如何做到这一点。

我通常不喜欢这个解决方案,因为它假设您的域模型与持久性模型相同 。 大多数人对此都很满意。 但我喜欢在Onion架构上保持非常分离的东西。

我根据经验发现,最终entity framework将使用dbcontexts,EF属性,公共setter,仅对数据库有意义的属性等污染您的域模型。

所以我通常保留2个独立的模型(类),其中“持久性”实体非常简单且与数据库模式非常相似,并且“域”实体富含行为和不变量。

这对上面的解决方案造成了问题,因为规范存在于域模型中,并且不能具有持久性模型的依赖性。

因此,您需要导航规范组合并创建以创建谓词。 访客是一个很好的设计模式。

我最近写了一系列post,我解释一下

  • 如何在C#中创建通用规范
  • 什么是访客设计模式以及如何使其通用 。
  • 以及如何在entity framework中实现规范模式