有没有更好的方法来实现依赖?
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 库(如果使用任何东西)来准确地初始化正确的实例更改。但总体思路是相同的——接口的两个实现,在需要的地方调用方法,但使用某种逻辑来正确初始化实例。
以下是我的用例:
员工管理是一个单独的 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 库(如果使用任何东西)来准确地初始化正确的实例更改。但总体思路是相同的——接口的两个实现,在需要的地方调用方法,但使用某种逻辑来正确初始化实例。