问题标签 [fluent-interface]

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 回答
330 浏览

c# - 关于C#流畅界面的问题

我有以下课程:

在英语语法中,你不能有“is something equal to something”或“does something greater than something”,所以我不希望 Is.EqualTo 和 Does.GreaterThan 成为可能。有什么办法可以限制吗?

谢谢!

0 投票
2 回答
2242 浏览

c# - Lambda Func<> 和 Fluent

现在有很多 Fluent 实现可以与 Lambda 一起做非常简洁的事情。我想把我的大脑包裹在它周围,这样我就可以开始创造一些这样的东西,但我还没有找到我的大脑理解的解释。

考虑这个简单的人员验证器示例

我已经设法在我的验证器上使用这样的方法来完成所有这些工作......

然后,我可以创建扩展方法来扩展 IValidator 以实现CannotBeNull 和CannotBeEmpty。

所以似乎我有问题的前半部分和后半部分,但我不确定如何将它们组合在一起。

寻找一个有意义的解释......我想“得到它”。:)

0 投票
3 回答
1363 浏览

c# - C# Lambda+Extensions+Fluent - 我该怎么做?

我希望能够创建采用给定对象的“转换”类,对其执行一系列转换(即更改属性值)并跟踪执行的转换。执行的转换将根据所提供对象的属性而有所不同。

我希望能够使用流畅的样式界面在给定的转换类中应用转换规则(它们是有限的和通用的)。

在高层次上,我知道我可能会有一个 ITransformer、一个 ITransformationRule 和 ITransformationResult 以及一些其他对象来实现这一点。

创建转换类时我希望代码如何工作......

我知道我的 TransformerBase 需要实现采用 Func 或 Expression 的“Transform”方法,并且我知道它需要保留 ITransformationRules 的集合。我也明白我可能会为“WhenCreatedBefore”和“ClassifyAs”方法使用扩展方法。

问题是,我不知道如何让它全部工作。我已经查看了 Fluent Validation .NET 的源代码,因为它以这种方式进行验证,但复杂性让我感到沮丧。我正在寻找涵盖此内容的教程,或者以非常简单的方式将其拼写出来的人。

提前致谢。

0 投票
2 回答
2215 浏览

c# - C#中具有流畅接口的多级继承

给定下面的示例控制台应用程序:

问题 #1:为什么 .Name() 返回 typeof OranizationBuilder,但 .Write() 调用 CorporationBuilder?

问题 #2:如何让 .Name() 返回 typeof CorporationBuilder?

编辑/更新

这是我第一次尝试解决方案(见下文),尽管我被困在工厂内部并且不确定如何配置 .Organization() 和 .Corporation() 方法类型。

具体问题区域如下:

如何配置 OrganizationBuilder 和 CorportationBuilder?

0 投票
1 回答
3981 浏览

nhibernate - Fluent Nhibernate Automapping 和 Guids / UniqueIdentifiers 作为主键字段的问题

我正在尝试使用 Fluent-NHibernate 自动映射功能(在最新版本的软件中)并且在使用 Guids 作为主键字段时遇到了问题。如果我使用整数字段作为主键,则表会成功生成,并且所有 Nhibernate 功能似乎都可以正常工作。仅供参考,我正在使用 NHibernate 生成我的数据库表。

下面是几个具有整数 ID 的类。

以下是具有 GUID 的相同类。

这是我的配置。

为了解决这个问题,我尝试为 1)命名 Id 字段(尽管我认为它应该是不必要的)和 2)生成 Id(我认为这将是自动的)生成约定(见下文)。我不确定发生了什么或为什么这不起作用。

此外,如果我关闭自动映射并使用 Fluently 配置的映射,则表会成功生成。

这让我发疯了,我相信这可能是一个快速解决方案。有任何想法吗?

谢谢!

安东尼

0 投票
2 回答
1445 浏览

c# - 用于 Fluent 接口的嵌套 Lambda

给定以下类型:

并在 Helper 上给出以下方法...

我能够做到这一点:

myHelper 上的字符串列表“Properties”将包含值“Children”,即通过表达式传递的属性名称。

我现在想做的是能够实现同样的事情,只是具有反映类型层次结构的能力。

会是这样吗?

或者甚至有可能,会涉及什么?我以前见过嵌套的 lambda,但不知道其中涉及什么。

提前致谢!

编辑

似乎有些混乱,所以我会尽力澄清。我希望能够使用 lambda 表达式和方法链接创建一个看起来像“Object.SubObject.SubSubObject”的字符串。我的示例执行此操作,但仅针对一个深度级别(类的属性)。我想做的是将其扩展到任何深度。

例如,我想使用带有流畅界面的 lambda 表达式,看起来像这样......

AddProps(x => x.Children).AddProps(xx => xx.GrandChildren) 这会将“Children.GrandChildren”添加到我的“Properties”字符串列表中。

0 投票
6 回答
523 浏览

testing - 持久化复杂的测试数据

我们正在使用构建器模式来生成测试数据。这些领域对象之间有关系。我们的功能测试要求这些对象被持久化。

想想这个模型:

领域模型

如果我想要一个普通的 CI 实例aNew().c().build()

如果我想让它坚持下去,我会aNew().c().saveIn(session)

如果我想要一个具有已知 BI 的 C 实例aNew().c().with(b).build()

嗯,你明白了。我的问题是,如果我想坚持一个C,它应该坚持它是B吗?还是应该事先坚持?如果我想要一个合理的默认 B 怎么办?如果我想坚持 D 怎么办?它应该坚持所有A,B,C吗?

当然,真实系统要复杂得多(有时带有循环引用)。我正在寻找持久化复杂测试数据的最佳实践。

编辑:看来我遇到了语言障碍,我的母语不是英语,所以我很抱歉晦涩难懂。以下是更多信息:

  • 我要测试的不是遗留代码
  • 我正在尝试编写覆盖测试,而不是单元测试(因此我不会嘲笑任何东西)
  • 如果数据库被填充到一定程度(它不使用所有实体),我试图测试的软件就可以工作。

PS。请不要犹豫,询问更多信息,因为我一直在努力寻找可能的最佳实践。我想出的最接近的事情是:

  1. 在构建实体时跟踪明确设置的内容。
  2. 假设显式设置的实体已经被持久化,不要持久化它们。
  3. 坚持其他一切(使用他们自己的坚持者)。

这会起作用,但是我的蜘蛛感觉很刺痛,我认为我做错了什么,因为测试代码中会涉及到逻辑,如果没有测试,处理起来会非常复杂。

编辑2:我会尽量让自己更清楚。当我编写/运行我的单元和一些集成测试时,我没有问题,因为测试数据没有持久化,它存在于内存中。

但是当我尝试持久化我的测试数据时,休眠不会让我保存没有关系的实体。

我该如何克服这个问题?

0 投票
19 回答
3763 浏览

java - 正则表达式的替代(流利?)接口的设计

我刚刚看到一个巨大的 Java 正则表达式,它让我对一般正则表达式的可维护性有所思考。我相信大多数人——除了一些糟糕的 perl 贩子——都会同意正则表达式很难维护。

我正在考虑如何解决这种情况。到目前为止,我最有希望的想法是使用流畅的界面。举个例子,而不是:

可以写这样的东西

在这个非常简短的示例中,创建正则表达式的常用方法对于任何有才华的平庸开发人员来说仍然很容易阅读。然而,想想那些用 80 个字符填满两行或更多行的诡异表达式。当然,(冗长的)流畅的界面需要几行而不是两行,但我相信它会更具可读性(因此可维护)。

现在我的问题:

  1. 你知道正则表达式的任何类似方法吗?

  2. 你同意这种方法比使用简单的字符串更好吗?

  3. 您将如何设计 API?

  4. 你会在你的项目中使用这样一个简洁的实用程序吗?

  5. 你认为这会很有趣吗?;)

编辑: 想象一下,可能存在比我们都没有从正则表达式中获得的简单构造更高级别的方法,例如

编辑 - 评论的简短摘要:

有趣的是,大多数人认为正则表达式会继续存在——尽管需要工具来阅读它们,聪明的人会想办法让它们可维护。虽然我不确定流畅的界面是最好的方法,但我相信一些聪明的工程师 - 我们?;) - 应该花一些时间让正则表达式成为过去 - 他们已经和我们一起工作了 50 年就足够了,你不觉得吗?

开放赏金

赏金将奖励给正则表达式新方法的最佳创意(无需代码)。

编辑 - 一个很好的例子:

这是我正在谈论的那种模式 -对第一个能够翻译它的人的额外荣誉 - RegexBuddies 允许(它来自 Apache 项目顺便说一句)授予chiimez的额外荣誉:这是一个符合 RFC 的电子邮件地址验证模式 -尽管它的RFC822(参见ex-parrot.com),而不是5322 - 不确定是否有区别 - 如果是,我将奖励下一个额外的荣誉,以获得适合 5322 的补丁;)

0 投票
1 回答
1496 浏览

c# - 流利课程的通用“TThis”

我正在构建一个流畅的接口,其中我有一个包含大部分流畅逻辑的基类,以及一个添加一些特殊行为的派生类。我面临的问题是从派生类型的实例调用时基类中流利方法的返回类型。调用基类的方法后,只有基类的方法可用于进一步的流畅调用。

更改调用方法的顺序将有助于它编译,但它会降低它的可读性,这对于流畅的接口来说有点重要。有没有办法为基类定义某种“This”类型,以便所有方法返回相同的类型。

例子

破碎的解决方案

我已经尝试通过执行以下操作来解决它,但它不是有效的 C# :( 但至少表达了我想如何编写接口。

0 投票
1 回答
3272 浏览

c# - 流畅的实体框架映射

有没有办法像 Fluent NHibernate for NHibernate 那样执行 Fluent EF Mapping ?