gpt4 book ai didi

wpf - WPF 中的应用程序变量,同时保持可测试性

转载 作者:行者123 更新时间:2023-12-04 19:37:30 24 4
gpt4 key购买 nike

我正在使用 MVVM 模式开发 WPF 应用程序。

每个 ViewModel 都需要访问一个安全对象,该对象主要提供有关用户拥有的权限的信息。因为这个对象只需要在启动时填充一次,而且因为填充它(至少可能)很昂贵,所以我想在应用程序的生命周期内保持它的状态。

我可以在 App 中将其设为静态变量,这将使它对整个应用程序可用(至少我是这么理解的)。这将使我的 ViewModel 实现非常难以测试,因为 App.SecurityObject 调用将内联在每个 ViewModel 中。我必须确保 App 可用于每个测试并模拟 App.SecurityObject 调用(我什至不确定这是否有效)。

我们正在使用 StructureMap,因此我可以创建一个 SecurityObjectProvider 并在容器中使用 Singleton 生命周期配置它,然后简单地使其成为每个 ViewModel 构造函数的一部分。缺点是(正如我所说)提供者必须是每个 View 模型构造函数的一部分。

还有其他我能想到的 hacky 解决方法,但它们将涉及创建方法(可能在 View Model 基类中),允许在实例化后注入(inject)安全对象,仅用于测试目的。我通常尽量避免这种“仅用于测试”的代码。

这似乎是一个常见问题,但我找不到任何完全正确的 SO 问题。

最佳答案

安全问题通常最好通过 Thread.CurrentPrincipal 来解决.如果完全有可能将您的安全问题纳入该模型(调用 Principal.IsInRole 等),那么这是迄今为止理想的解决方案。

单元测试非常容易,因为您只需在调用 SUT 之前设置 Thread.CurrentPrincipal|然后确保在 Fixture Teardown 中将其恢复为原始值阶段。

如果 Thread.CurrentPrincipal 不适合您的需要,我会建议注入(inject)依赖项或处理安全性的装饰器。安全性通常是一个横切关注点,因此通常最好尽可能以声明方式处理它。换句话说,如果你可以通过 Guards 和 Assertions 来建模,你就不需要主动调用它,你就可以使用更像 AOP 的方法(比如装饰器) .

如果这也不可能,您可以将其建模为 Ambient Context .这可能看起来有点像 Service Locator anti-pattern , 但不同之处在于它是强类型的并且有一个 Local Default 确保它永远不会抛出 NullReferenceExceptions 或类似的异常,因为它保护了它的不变量。

关于wpf - WPF 中的应用程序变量,同时保持可测试性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2290607/

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