gpt4 book ai didi

c# - 如何避免或单元测试意外使用具体的单例类型而不是使用 StructureMap 进行抽象

转载 作者:太空狗 更新时间:2023-10-29 23:43:56 24 4
gpt4 key购买 nike

我最近在我的代码中遇到了以下错误,这让我一直在调试。我想注入(inject)一个基于其接口(interface)的实例,如下所示:

MovementController(IMotorController motorController)

但是我不小心使用了这样的具体类型:

MovementController(MotorController motorController)

在我尝试从 MovementController 实例访问 motorController 之前,该项目仍然构建并运行良好。由于 IMotorController 的底层实现访问硬件,它必须是单例或我的锁代码。然而,由于我有其他类注入(inject)了 IMotorController,我现在在我的对象图中有两个实例 MotorController,它们都通过串行连接访问硬件。这在运行时导致了一个低得多的错误,这让我花了很长时间来调试并找到真正的原因。

如何避免此类错误或为我的 StructureMap 注册表编写单元测试以捕获此细微错误?

最佳答案

您可以使用 NDepend 等静态分析工具轻松检查这一点。使用它,您只需查找作为 Controller 的类型,然后检查它们的构造函数并在您发现任何非接口(interface)类型的构造函数参数时发出警告。


只是为了完善 Steve 的答案,您可以编写一个代码规则,它看起来像:(使用 NDepend 代码规则是 C# LINQ querywarnif count > 0 为前缀)

// <Name>Don't use MotorController, use IMotorController instead</Name>
warnif count > 0
from m in Application.Methods
where m.IsUsing ("NamespaceA.MotorController ") &&
m.ParentType.FullName != "NamespaceB.ClassThatCanUseMotorController "
select m

如果有零个或多个 ClassThatCanUseMotorController,可以很容易地细化规则。

关于c# - 如何避免或单元测试意外使用具体的单例类型而不是使用 StructureMap 进行抽象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38785806/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com