有没有更好的方法来实现依赖?

Is there a better way to implement dependencies?

以下是我的用例:

员工管理是一个单独的 C# class 库项目。 并且在应用程序级别有一个员工管理设置。这意味着有一个全局布尔变量 isEmployeeManagement

如果变量为真,则整个应用程序中使用的与管理相关的所有代码都应该执行,例如

IEmployeeManagement.AddUser();
IEmployeeManagement.DeleteUser();

但是如果设置为false则;以下几行不应通过任何异常。我想到的一种方法是检查条件。

If (isEmployeeManagement)
  IEmployeeManagement.AddUser();

但我想使用接口来实现这一点,而不需要在条件中放置任何代码。所以如果设置为false,上面的代码应该不会报错。

如果你能帮助我实现,我将不胜感激。

所以如果你有接口 IEmployeeManagement:

public interface IEmployeeManagement {
    void AddUser();
}

然后你的 class 实现了它:

public class RealManagement : IEmployeeManagement {
    public void AddUser() {  do lots of stuff  }
}

不是为每个 AddUser 调用都设置 if 条件,而是创建另一个接口实现:

public class VoidManagement : IEmployeeManagement {
    public void AddUser() {  do nothing  }
}

这样您就不需要在每个方法调用时执行 if 条件,而是仅在 class 初始化时执行。

如果您使用某种依赖注入框架,您可以只设置一次该逻辑,而不是在每次 class 创建时。

如果设置是在整个应用程序级别,对于所有用户,您可能会有这样的设置

Startup.cs(假设.net 核心):

public void ConfigureServices(IServiceCollection services)
        {
            if(Configuration["isEmployeeManagement"] == "true") {
                services.AddTransient<IEmployeeManagement>(RealManagement);
            } else {
                services.AddTransient<IEmployeeManagement>(VoidManagement);
            }
        }

如何根据您如何获取 isEmployeeManagement、服务的生命周期以及您使用的 DI 库(如果使用任何东西)来准确地初始化正确的实例更改。但总体思路是相同的——接口的两个实现,在需要的地方调用方法,但使用某种逻辑来正确初始化实例。