gpt4 book ai didi

c# - Simple Injector在BaseClass中注入(inject)多个依赖项

转载 作者:行者123 更新时间:2023-12-03 10:52:04 24 4
gpt4 key购买 nike

我有一个由多个BaseViewModel类继承的ViewModel。在我的BaseViewModel中,我有几个依赖项从ViewModel注入(inject)。现在,如果需要在BaseViewModel中添加新的依赖项,则需要更改所有继承BaseViewModel的虚拟机。请让我知道如何在Simple Injector中处理它。以下是我的代码结构:

我如何使我的基类注入(inject)独立,以便不需要在所有继承的类中进行更改?

代码:

public class BaseViewModel
{
protected readonly IAESEnDecrypt AESEnDecrypt;
protected readonly IDataService DataService;
protected readonly INavigationService NavigateToPage;
public BaseViewModel(INavigationService nav, IDataService data, IAESEnDecrypt encrypt)
{
AESEnDecrypt= encrypt;
NavigateToPage = nav;
DataService = data;
}
}


public class ViewModel
{
public ViewModel(INavigationService nav, IDataService data, IAESEnDecrypt encrypt) : base (nav, data, encrypt)
{

}
}

我的BaseViewModel包含以下一些接口(interface),这些接口(interface)的实现是通过构造函数注入(inject)的:
- NavigationService
- DataService
- GeoLocationService
- SmartDispatcher
- MessageBus which implement Message Aggregator

它还包含一些公共(public)属性,作为静态变量,其数据在整个应用程序中都使用,例如UserDetails。并且还包含CancellationToken,IsBusy以显示进度条。

BaseViewModel还包含HandleException方法,该方法处理来自所有ViewModel的所有传入异常。
还包含一些常用命令,这些命令在所有 View 中都使用,例如Si
gnoutCommand,导航栏命令。

实际上,它已经开始包含各种ViewModel中使用的各种通用方法。

请提出如何重构该代码?

最佳答案

首先不要使用此基类。这个基类有很大的代码味道,结果是您当前的痛苦。这样的基类将违反“单一职责原则”(SRP),并且仅充当所有派生 View 模型的重要帮助类,或者甚至似乎在其中放置了跨领域的关注点。基类甚至可能隐藏您的 View 模型违反SRP的事实。他们可能做得太多;责任太多。

而是,尝试执行以下操作:

  • 将横切关注点从基类中移到装饰器中,或者找到另一种应用横切关注点的方法。
  • 将相关的依赖项一起组合到aggregate service中,并将此类聚合服务注入(inject)到您的 View 模型中。

  • 在设计良好的应用程序中,几乎不需要具有依赖关系的基类。

    如果您不能更改设计(但是请一定注意一下;如果没有该基类,您会处于一个更好的位置),则可以恢复为显式的属性注入(inject)。 Simple Injector并没有开箱即用,但是 describes文档介绍了如何做到这一点。

    基本上,归结为编写自定义 IPropertySelectionBehavior,将 BaseViewModel的构造函数依赖项移至公共(public)属性并使用自定义属性对其进行标记。

    但是同样,只能将属性(property)注入(inject)作为最后的手段。属性注入(inject)只会隐藏设计问题;它不会解决。

    关于c# - Simple Injector在BaseClass中注入(inject)多个依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28295804/

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