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

时间:2019-03-28 09:37:34

标签: c# design-patterns interface abstract-class

以下是我的用例:

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

如果变量为true,则应在整个应用程序中使用与管理相关的所有代码,例如

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

但是如果设置为false,那么;以下几行不应有任何例外。我想到的方法之一就是检查条件。

If (isEmployeeManagement)
  IEmployeeManagement.AddUser();

但是我想使用Interfaces实现此功能,而无需在条件中放入任何代码。因此,如果设置为false,则上面的代码不应出现任何错误。

感谢您能否帮助我进行实施。

1 个答案:

答案 0 :(得分:1)

因此,如果您具有IEmployeeManagement接口:

public interface IEmployeeManagement {
    void AddUser();
}

然后您就有一个实现它的类:

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

进行另一个接口实现,而不是对每个AddUser调用都具有if条件:

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

这样,您无需在每个方法调用上都设置条件,而只需在类初始化时执行。

如果使用某种依赖注入框架,则只能在每个类创建时将逻辑设置一次,而不必设置。

如果该设置是在整个应用程序级别上,对于所有用户,您可能会有类似的情况

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

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

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