小编Den*_*men的帖子

扩展方法过载选择

我有两种扩展方法:

public static IPropertyAssertions<T> ShouldHave<T>(this T subject)
{
    return new PropertyAssertions<T>(subject);
}

public static IPropertyAssertions<T> ShouldHave<T>(this IEnumerable<T> subject)
{
    return new CollectionPropertyAssertions<T>(subject);
}
Run Code Online (Sandbox Code Playgroud)

现在我写一些使用它的代码:

List<Customer> collection2 = new List<Customer>(); 
collection2.ShouldHave(); //first overload is chosen
IEnumerable<Customer> collection3 = new List<Customer>(); 
collection3.ShouldHave(); //second overload is chosen
Run Code Online (Sandbox Code Playgroud)

仅当我明确指定IEnumerable类型时才选择第二个重载.有没有办法在两种情况下都选择第二次过载?

.net c# extension-methods overloading fluent-assertions

12
推荐指数
3
解决办法
598
查看次数

如何提高SpecFlow/Gherkin步骤之间的可重用性?

我想我完全理解SpecFlow背后的概念和想法,但即使阅读了Secret Ninja Cucumber Scrolls,The Cucumber Book,并且经历了各种论坛,我仍然不确定可重用性的途径.

我们的方案已经符合各种指南

  • 自我解释
  • 必须具有可理解的目的(使其与其他方案不同的原因)
  • 很独特
  • 表示垂直功能切片
  • 使用无所不在的语言
  • 从利益相关者的角度撰写
  • 关于业务功能,而不是软件设计
  • 由Epics组成
  • 不是测试脚本
  • 让其他人阅读它们以查看方案是否正确
  • 不引用UI元素
  • 代表关键的例子
  • 非技术
  • 精确且可测试
  • 尽可能重复
  • '给定'代表国家,而不是行动
  • '何时'代表行动
  • '然后'应代表一个明显的变化,而不是一些内部事件

我们的步骤必须遵守以下准则(一些特定于SpecFlow):

  • 使用无所不在的语言
  • 不引用UI元素
  • 不应该合并
  • 所有功能都应该是可重用的和全局的
  • 不应该链接到特定功能
  • 由实体,实体组或域概念分组
  • 不要创建在步骤定义文件中重用逻辑的步骤
  • 仔细考虑步骤所属的步骤文件
  • 不要在阶段之间重复使用步骤
  • 必须避免步骤中的文字字符串,但如果需要,请使用单引号
  • 切勿将多个[Given],[When]或[Then]属性应用于step方法
  • 根据它们代表的阶段订购步骤
  • 如果它对场景不重要,那么更重要的是不要提及它

但即使我们使用正则表达式占位符,我们仍然会得到相同步骤的大量变体.特别是如果某些事情不重要,你就不应该提到这些变化的规则.是的,在内部这些步骤重复使用,但不在场景中.

考虑例如以下场景:

Feature: Signing where both persons are physically available

@Smoke
Scenario: Show remaining time to sign based on previous signature
  Given a draft proposal
  And the first signature has been set
  When I try to set …
Run Code Online (Sandbox Code Playgroud)

bdd acceptance-testing cucumber specflow gherkin

7
推荐指数
1
解决办法
3743
查看次数

如何跨聚合根处理并发约束

我担心我已经知道了答案,但我希望有人可以提供以前没有找到的替代解决方案.一如既往地根据有效聚合设计做DDD 比我想象的要困难,但这是我的情景.

  • 我们有两个AR,User和RoleGroup
  • 可以向用户授予特定的RoleGroup,从而获得该角色组中的角色(集合值对象)提供的权限.角色组的身份在用户AR中保留为另一个VA.
  • 从系统中删除RoleGroup时,我们引发一个域事件,处理程序使用该事件来查找引用该RoleGroup的所有用户并删除该引用.相应的投影非规范化器将使用相同的事件来更新用户的有效角色.这是授予该用户的各个角色和所有已授予的RoleGroup的角色的组合.
  • 这不一定是事务性的(现在它可以最终一致).
  • 我们使用Jonathan Oliver的EventStore 3.0以及来自Lokad.CQRS和NCQRS的元素来使用事件采购.

因此,理论上,当一个请求(它是一个ASP.NET MVC应用程序)正在执行上面提到的场景时,另一个请求可能会向用户授予相同的RoleGroup.如果在上述域事件处理程序扫描与该RoleGroup相关的用户之后发生这种情况,则该请求将完成.此时,您有一个已删除的RoleGroup(尽管不是物理上的)和仍保留该RoleGroup标识的User.

你怎么防止这种情况?我们目前正在考虑使用户的身份被授予该RoleGroup AR的特定RoleGroup部分,因此删除RoleGroup并将其授予用户将导致乐观的并发冲突.但不知何故,这不是正确的解决方案.

domain-driven-design eventual-consistency aggregateroot

6
推荐指数
1
解决办法
1204
查看次数