给个星星吧!:star:
如果你喜欢或正在使用这个项目,请给它一个星星。谢谢!
Specification
这是一个带有测试的基类,用于向DDD模型添加规约。还包括一个默认的通用Repository基类,支持EF6和EF Core。目前在Microsoft参考应用程序eShopOnWeb中使用,这是查看其实际应用的最佳场所,同时也在Clean Architecture解决方案模板中使用。另外,还可以查看Steve "ardalis" Smith相关的(免费!)电子书,使用ASP.NET Core和Azure构建现代Web应用程序。
文档
阅读文档
视频
🎥 观看Ardalis.Specification v5的新特性
版本7发布说明
版本7现已在NuGet.org上可用!我们遇到了很多关于Ardalis.Specification(和/或EF6/EFCore包)的版本需要与使用项目的.NET版本匹配的困惑。我们打算在近期更频繁地对这个包进行版本更新,以明确表示它不需要匹配。
重大变更
- 更新项目,放弃对旧TFM的支持。由@fiseni在https://github.com/ardalis/Specification/pull/326 中完成
其他更新
- 补丁2 由@davidhenley在https://github.com/ardalis/Specification/pull/283 中完成
- 修复文档主页中的
Just the Docs
链接 由@snowfrogdev在https://github.com/ardalis/Specification/pull/293 中完成 - 更新url路径 由@ta1H3n在https://github.com/ardalis/Specification/pull/303 中完成
- 实现SelectMany支持 由@amdavie在https://github.com/ardalis/Specification/pull/320 中完成
- 为可能长期存在的仓库使用场景(例如Blazor组件注入)添加两个方法 由@jasonsummers在https://github.com/ardalis/Specification/pull/289 中完成
- 添加对AsAsyncEnumerable的支持 由@nkz-soft在https://github.com/ardalis/Specification/pull/316 中完成
- Lamadelrae/doc faq ef versions 由@Lamadelrae在https://github.com/ardalis/Specification/pull/324 中完成
- 更新搜索功能以生成参数化查询 由@fiseni在https://github.com/ardalis/Specification/pull/327 中完成
- 添加对扩展默认评估器列表的支持 由@fiseni在https://github.com/ardalis/Specification/pull/328 中完成
- Ardalis/cleanup 由@ardalis在https://github.com/ardalis/Specification/pull/332 中完成
版本6发布说明
参见发布
使用示例
规约模式将查询特定的逻辑从应用程序中当前存在的其他位置抽取出来。对于直接使用EF Core且抽象程度较低的应用程序,规约将从几乎所有使用Where
、Include
、Select
及类似表达式的地方消除这些表达式。在将数据库查询逻辑抽象到Repository
后面的应用程序中,规约通常会消除许多自定义Repository
实现类以及Repository
实现上的自定义查询方法的需求。不同于使用各种方法来过滤和塑造数据的多种不同方式,现在可以通过几个核心方法实现相同的功能。
在你的仓库中使用规约的示例实现
public async Task<List<T>> ListAsync(ISpecification<T> specification, CancellationToken cancellationToken = default)
{
return await ApplySpecification(specification).ToListAsync(cancellationToken);
}
private IQueryable<T> ApplySpecification(ISpecification<T> specification)
{
return SpecificationEvaluator.Default.GetQuery(dbContext.Set<T>().AsQueryable(), specification);
}
现在要使用这个方法,调用代码只需实例化并传递适当的规约。
var spec = new CustomerByNameSpec("customerName");
var customers = await _repository.ListAsync(spec, cancellationToken);
规约应该定义在应用程序中易于发现的位置,以便开发人员可以轻松重用它们。使用这种模式有助于消除应用程序中许多常见的重复lambda表达式,减少与这种重复相关的错误。
我们提供了一个内置的仓库实现RepositoryBase,可以直接在你的应用中使用。你可以将其作为参考,创建自己的自定义仓库实现。
运行测试
这个项目需要一个数据库来测试,因为许多测试验证规约是否被EF Core从LINQ转换为SQL。为了运行测试,我们使用Docker容器,包括一个Docker托管的SQL Server实例。你只需运行RunTests.bat
或RunTests.sh
即可运行测试。
参考
在YouTube.com/ardalis上有一些免费的视频流,其中开发和讨论了这个包。
- 与嘉宾Fiseni一起回顾规约模式和NuGet包 2020年11月6日
- 使用规约和其他项目进行开源.NET开发 2020年1月14日
- 更新规约和GuardClauses Nuget包/GitHub示例 2019年11月20日
- Ardalis - 在Ardalis.Specification和EF Extensions GitHub项目上工作 2019年8月16日
- 在Ardalis.Specification Nuget包和集成测试上工作 2019年7月23日
Pluralsight资源: