C# 如何测试参数C的顺序#

C# 如何测试参数C的顺序#,c#,cqrs,C#,Cqrs,我目前正在CQRS系统上工作 它使用标准实践中的命令和事件。命令和事件只是.NET类,但这些类通常包含许多Id作为属性,这些Id都是GUI 这导致在构造类时出现问题。团队中有人会以错误的顺序调用构造函数,这是一个很大的风险。您可以想象这个简单的问题将是多么具有破坏性,即OrderId分配给CustomerId,反之亦然 所以我正在寻找解决这个问题的方法 我自己也有一些想法 为每个Id创建一个单独的类型,即用许多类型替换guid。这是显而易见的面向对象解决方案。但是我不喜欢它有很多原因 一致的命名

我目前正在CQRS系统上工作

它使用标准实践中的命令和事件。命令和事件只是.NET类,但这些类通常包含许多Id作为属性,这些Id都是GUI

这导致在构造类时出现问题。团队中有人会以错误的顺序调用构造函数,这是一个很大的风险。您可以想象这个简单的问题将是多么具有破坏性,即OrderId分配给CustomerId,反之亦然

所以我正在寻找解决这个问题的方法

我自己也有一些想法

  • 为每个Id创建一个单独的类型,即用许多类型替换guid。这是显而易见的面向对象解决方案。但是我不喜欢它有很多原因
  • 一致的命名和单元测试:如果我们总是将我们的Id命名为类似的Id。我们可以潜在地测试调用者和被调用者中的参数列表是否相同(或类似)。当我们只使用Guid.NewGuid()时,忽略大小写。不过,测试并不简单。对于调用的方法的参数,使用Reflection或Mono.Reflection很容易获得参数列表。对打电话的人来说,这是另一回事。例如,可以优化方法中的变量。因此,为了测试调用方,我们需要做一些反射以外的事情,例如,按照stylecop的思路

  • 总而言之,我对这两种想法都不感兴趣,我想要更简单的解决方案,或者是现成的解决方案?

    每个id单独输入是一种很好的解决方案,但我也不喜欢它

    单元测试方法调用是一个非常困难的问题。一致的命名总是好的

    在我看来,命令/事件中太多的参数是出现问题的第一个信号。可能是命令导致了太多的事情,或者某些参数可以通过基础设施(如当前用户标识)传递

    编辑:
    如果您可以确保没有订单和客户(例如)具有相同的Id(我认为使用GUID是安全的假设),您可以验证两者是否存在,并且如果有人在某个地方混合了这两个值,那么在运行时总是会有错误,因此错误很容易被发现。

    一个想法是在GUID前面加前缀(因为它们是字符串)具有类型标识符。因此,伪GUID
    对于客户ID
    xxyy
    变为
    cust#uxxyy
    但是,作为C#强类型,我建议使用类和属性作为正确的方法。

    使用离散类型是“最安全的”在类型系统内部,但这仅在值可能意外交叉或混合到不同级别时才推送。无论如何,一致的命名都是好的,并且无论如何都需要正确的测试(对于语义验证,例如,相同类型字段的排序)。(另外,使用不同的类型/离散类型与OOP没有严格的关系。)这个问题似乎离题了,因为它不是关于一个特定的编程问题,更适合于。此外,我不确定这是否真的与CQR有关。它更多地与将值作为参数传递给具有多个相同类型参数的构造函数或方法有关。答案肯定是肯定的固执己见,可能会有很大差异。强制执行使用命名参数的策略。有趣。这实际上可能是最好的解决方案。但只有在特定程序集上可能的情况下。我将研究使用Resharper是否可能。是的,我在一定程度上同意你的意见。但问题是存在的,即使只有两个参数。这是真的,但我确实同意It’用机器代替思考是不可能的。我添加了另一个想法来解决这个问题。您的编辑很有趣,但我认为还需要一个AOP框架。因为我不能仅仅测试这两个值是否存在——因为它们确实存在——我必须测试它们是否匹配正确的属性。或者我没有正确地理解你?无论如何,使用AOP,我可以使用您或Peter Smith的想法注入验证属性的代码。因此,也许AOP实际上就是答案……我的意思是:检查具有给定id的客户是否确实存在。我需要在验证方法中检查这一点,该方法需要由构造函数调用。因此需要一个AOP框架来自动注入代码。手动操作会很乏味。前缀是一个有趣的想法,但我不认为它是可行的。然后我需要在所有方法调用中验证guid/字符串?如果我使用了som AOP框架,那么可能。你最后的陈述与我的1相同。想法。我意识到了这一点——只是支持这个想法。感觉关键要求是唯一地标识参数。简单是最好的,有时从看似倒退的开始就必须发生。你是对的。但是我会用类型来混乱解决方案,因为所有实体都有一个Id。我也会丢失一些数据库Id的自动内容。但是是的,从纯粹主义的角度来看,这绝对是正确的解决方案,但正如我所说的,我正在寻找一个替代方案。