如何使用实体框架实现规范模式?
答案 0 :(得分:17)
规格模式:
对于那些想要入门的人,请访问 link 。
了解实体框架规范:
阅读 this 。这包括以下非常重要的几点。在任何类型的真实世界应用程序中,您很快就会想要将多个规范链接在一起。这被称为组成规范。您将需要掌握Linq to Entities中解决规范组合的一些注意事项。您需要知道这一点,因为使用Linq to Entities是表达规范满意度标准的理想方法。
解决问题:
下载并安装 this 。它修复了Linq与您在第二步中阅读的实体的缺点。 This 解释了修补程序实施的更多细节。
实施它!
您应该有足够的信息来实现模式。保持谷歌搜索。为EF做这件事并不是很简单,但值得付出努力。 This是一个非常有趣的实现。
答案 1 :(得分:4)
基本上,在实现规范模式时应该没有什么特别的(由于EF)。您将规范实现为单独的类,这些类适用于您的域模型。
答案 2 :(得分:1)
只需使用NSpecifications lib。免费。您可以将其与任何基于IQueryable接口的ORM(例如,实体框架或Linq2Sql)一起使用: https://github.com/jnicolau/NSpecifications
或者从Nuget获取它:
安装软件包N规范-版本1.1.0
答案 3 :(得分:0)
正如您可能已经知道的那样,规范模式将使您能够将过滤器发送到您的存储库(以及其他用法)。 我已经看到很多实现这样做。
通常,人们在规范接口上公开另一个方法,表示必须发送到Entity Framework的表达式树:
public interface ISpecification<T>
{
bool IsSpecifiedBy(T item);
Expression<Func<T, bool>> GetPredicate()
}
存储库将调用GetPredicate
方法并将其传递给EF的DbSet上的Where
方法。
这样你就可以限制生成哪些表达式,并保证它会生成一个有效的SQL语句。
要在规范上启用布尔运算符,您需要将表达式混合在一起。有this post from Vladmir Khorikov,他详细解释了如何做到这一点。
我通常不喜欢这个解决方案,因为它假设你的domain model is the same as your persistence model。大多数人对此都很满意。但我喜欢在Onion architecture上将事情分开。
我根据经验发现,最终Entity Framework将使用dbcontexts,EF属性,公共setter,仅对数据库有意义的属性等污染您的域模型。
所以我通常保留2个单独的模型(类),其中“持久性”实体非常简单且非常类似于数据库模式,“域”实体富含行为和不变量。
这对上面的解决方案造成了问题,因为规范存在于域模型中,并且不能具有持久性模型的依赖性。
因此,您需要导航规范组合并创建以创建谓词。访客是一个很好的设计模式。
我最近写了一系列文章,我解释了