问题标签 [specification-pattern]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2285 浏览

linq - 如何创建表达式集合>?

我有一个使用以下方法的存储库:

我需要传递多个表达式。我正在考虑将签名更改为:

  1. 这可能吗?
  2. 例如,如何创建一个表达式数组以传递给此方法?

目前我正在从我的服务层调用该方法,如下所示:

但我想通过p => p.Variantsp => p.Reviews例如。然后在存储库中,我想遍历表达式并将它们添加到查询中。

有关我为什么这样做的一些背景信息,请参阅 Ben Foster 的博客文章Eager loading with NHibernate

0 投票
1 回答
1758 浏览

c# - 动态表达式 API:我可以做一个谓词,如何编写 OrderBy 规范?

我想出了如何从基于Dynamic Linq的客户端提供的字符串中执行谓词(这包含在 Specification 对象中):

其中 filter 是其帮助文件中描述的表达式语言字符串。奇迹般有效。

但是,是否可以将 orderby 字段的字符串列表转换为强类型表达式,如下所示:

笔记:

这是我过滤和订购商品的存储库方法

我想使用以下方法调用它:

关于如何将 OrderBy 字段的字符串列表转换为强类型 lambda 表达式的任何想法?字符串的示例是:

另一个注意事项:

我正在翻译来自客户端的字符串,这些字符串正在使用正则fieldname op value表达式验证它们以防止注入。另外,我只在 Specification 对象中引用 Dynamic Linq,而不是存储库。

0 投票
2 回答
632 浏览

c# - 实体框架 - 关于业务层需求的意见

目前我的网站有一个存储库模式,其中包含规范模式。只需几行代码,我就可以从我的 .aspx 页面中获取数据,例如:

现在我的问题是,我的网站是否需要业务层?如果您的回答是肯定的,为什么?目前看来,由于规范模式,我不需要页面和存储库之间的业务层。

感谢您的意见。

0 投票
1 回答
244 浏览

c# - 需要帮助理解规范模式 - 继承

我相信这更像是一个继承问题,但是由于我试图通过实现使用它的模式来更好地掌握它,我想我会问我的相关问题以便更好地掌握。

如果您使用规范模式,有许多规范都派生自规范,并用包装规范类包装它们:

例子 :

我的问题是:既然您将客户实体传递给 acceptCustCreditStatusSpec 的 IsSatisfiedBy 方法(第一个假设),那么客户实体如何传递给 unlimitedCreditLimitSpec 和 SufficientCustCreditAmtSpec 规范的 IsSatisifedBy 方法?

谢谢,

0 投票
1 回答
1262 浏览

entity-framework-4 - 使用带有 EF4 的存储库模式加入集合时遇到困难

我很难让这个背后的设计正确。我正在使用存储库模式来管理我的数据层。在我的一个控制器(MVC3)中,我正在构建一个需要执行连接的 LINQ 查询。我对此有两个问题:

  1. 向我的存储库添加一个方法来执行所有连接、投影等更好吗?我对此有点犹豫,因为这会导致我的存储库上的合同定义不断增长?
  2. 假设我在返回所有项目的 Post 存储库中有一个 List() 方法。我目前无法在 linq (join) 查询中使用此方法,因为它无法将其转换为存储表达式。请注意,下面的代码使用了一个名为 repo 的类,它使用相同的上下文实例保存对我所有存储库(帖子、朋友)的引用。

大编辑: 现在对我来说事情有点清楚了,但我希望有人会跳到这里来帮助我把一切整理好;-)。我要做的是实现一个规范模式以及我的存储库模式。问题是,我正在使用 POCO,而我的存储库正在使用使用 IObjectSets 的 IContext 接口。因此,在下面的列表方法中,Posts 是一个 IObjectSet,Context 是一个 IContext 接口,我将实际上下文注入其中。

我一直在阅读并且有一些非常好的即用型代码,例如 implementation-repository-pattern-with-ef4-poco-supportimplementation-repository-pattern-with-entity-framework

这两个示例都使用存储库中的 objectContext。把它抽象出来不是更好吗?

我的存储库:

在我的控制器方法中:

但是,以下确实有效(为什么?):

它与此处描述的问题基本相同:linq-to-entities-does-not-recognize-the-method

我该如何围绕这个设计?我一直在阅读模型定义的函数,但我不确定这是否可行?

提前致谢

0 投票
1 回答
4063 浏览

c# - 在规范中组合 C# 代码和数据库代码

有时您需要定义一些业务规则,而规范模式是一个有用的工具。例如:

但是,我经常发现我需要将这些规则“推送”到 SQL 中以提高性能或满足分页记录列表之类的需求。

然后我不得不为规则编写两次代码,一次用 CLR 代码,一次用 SQL(或 ORM 语言)。

你如何组织这样的代码?

最好将代码放在同一个类中。这样,如果开发人员正在更新业务规则,他们忘记更新两组代码的机会就会减少。例如:

然而,这对我来说似乎很丑陋,因为我们现在将关注点混合在一起。

另一种选择是使用 Linq-To-YourORM 解决方案,因为 LINQ 代码可以针对集合运行,也可以转换为 SQL。但我发现,除了最琐碎的场景之外,这种解决方案几乎不可能出现。

你做什么工作?

0 投票
5 回答
147977 浏览

.net - LINQ to Entities 无法识别该方法

尝试执行 linq 查询时出现以下错误:

LINQ to Entities 无法识别“Boolean IsCharityMatching(System.String, System.String)”方法,并且该方法无法转换为存储表达式。

我读过很多以前的问题,人们会遇到同样的错误,如果我理解正确,那是因为 LINQ to Entities 需要将整个 linq 查询表达式转换为服务器查询,因此您不能调用外部方法在里面。我还没有能够将我的场景转换成可行的东西,而且我的大脑开始崩溃,所以我希望有人能指出我正确的方向。我们正在使用实体框架和规范模式(我对这两者都很陌生)。

这是使用规范的代码:

这是 linq 表达式:

这是 IsCharityMatching 方法:

如果您需要更多信息,请告诉我。

非常感谢,

安妮莉

0 投票
1 回答
682 浏览

linq - Linq:运算符不理解表达式类型谓词的查询语法

我已将规范定义为如下类型的对象Expression<Func<User, bool>>

这对于用扩展方法语法编写的查询非常有效:

但不是使用 Linq 查询语法:

编译器给了我cannot implicitly convert type 'Expression<Func<User, bool>>' to 'bool'.

是什么赋予了?我认为 Linq 查询语法只是一个可爱的 DSL 修饰扩展方法语法。谁能告诉我如何将我可爱的规范与 Linq 查询语法一起使用?

0 投票
4 回答
695 浏览

c# - Linq:如何对关联对象使用规范

我以这种形式使用规范:

现在我可以使用以下形式的规范:

但我不确定如何对这样的关联对象使用规范:

有没有办法做到这一点,还是我需要重新考虑我的规范实施?

0 投票
2 回答
3504 浏览

domain-driven-design - 规范模式对象应该在哪一层“新建”?

所以,我在这里查看了一些关于规范模式的帖子,但还没有找到答案。

我的问题是,在 n 层架构中,规范究竟应该在哪里“更新”?

  1. 我可以将它们放在我的服务层(又名,有时称为应用程序层......基本上,一个 .aspx 代码隐藏会与之交谈的东西),但我觉得这样做,我让业务规则泄露出去域。如果通过其他方式访问域对象(除了服务层),域对象就不能强制执行它们自己的业务规则。

  2. 我可以通过构造函数注入将规范注入我的模型类。但同样,这感觉是“错误的”。我觉得应该注入模型类的唯一东西是“服务”,如缓存、日志记录、脏标志跟踪等......如果你能避免它,使用 Aspects 而不是乱扔模型的构造函数具有大量服务接口的类。

  3. 我可以通过方法注入(有时称为“双重调度”???)注入规范,并明确地让该方法封装注入的规范以强制执行其业务规则。

  4. 创建一个“域服务”类,它将通过构造函数注入获取规范,然后让服务层使用域服务来协调域对象。这对我来说似乎没问题,因为规范强制执行的规则仍然在“域”中,并且域服务类的命名非常类似于它正在协调的域对象。这里的事情是我觉得我正在编写很多类和代码,只是为了“正确”实现规范模式。

除此之外,有问题的规范需要一个存储库才能确定它是否“满意”。

这可能会导致性能问题,尤其是。如果我使用构造函数注入 b/c 消费代码可以调用一个可能包装规范的属性,而这反过来又调用了数据库。

那么有什么想法/想法/文章链接吗?

新建和使用规范的最佳地点在哪里?