我正在尝试创建一种机制,允许应用程序决定(在运行时)是否执行某些功能。
“Some Functionality”可以是任何东西,它可以是包含在几个dll中的几个类中的c#代码,它可以是UI,它可以是数据库查询执行等。
最重要的是,它应该适合我现有的基础架构,我无法从头开始重新设计和构建。
我想得越多,似乎我可以使用的唯一解决方案就是保存一些表,它将成为“功能存储库”,它会告诉(通过唯一键)功能是否打开/关闭。
然后在代码中,我必须在处理此类功能的每个位置放置一个 if else 语句。
例如
If(functionalityEnabled)?
DoFunctionality()
Else
DoTheUsusal()
是否有更好的方法或更好的设计来实现它?我想让解决方案尽可能简单,但另一方面,这个解决方案真的很难看,最终会使我的代码看起来像意大利面条代码。
您的想法将不胜感激, 我正在使用 c# 和 sql server,用于 web 服务的 web api。
编辑:
我想说的是,我感谢大家花时间和精力回答我的问题,你们提出了一些非常有趣的想法。 我最终标记了@dasblinkenlight 答案,因为它最适合需要,尽管这里的其他答案非常好并且可能对其他人有用。
谢谢。
最佳答案
如果您有两个实现相同接口(interface)的类,您的应用程序可以调用该类的功能(方法、属性)而无需确切知道它是在调用基本功能还是替代功能:
IFunctionalityX {
DoIt();
}
class BasicFunctionalityX: IFunctionalityX {
public DoIt() {
// Default behaviour goes here
}
}
class PluginFunctionalityX: IFunctionalityX {
public DoIt() {
// Alternative functionality.
}
}
如果 PluginFunctionalityX 与 BasicFunctionalityX 共享其部分实现,您可以从另一个继承它,但是否这样做并不重要。只要用到接口(interface)就可以了,不管类有没有关联都可以用这个方法。
在程序的初始化中,您可以做出一次决定并创建正确类的实例。您可以将此类存储在某个包含所有功能的容器中。 FunctionalityX 是接口(interface) IFunctionalityX 的属性,您可以为其他功能创建其他接口(interface)(和属性)。
if (functionalityXEnabled) {
FunctionalityContainer.FunctionalityX = new PluginFunctionality();
} else {
FunctionalityContainer.FunctionalityX = new BasicFunctionality();
}
然后,在您的应用程序的其余部分,您可以通过以下方式调用您的功能:
FunctionalityContainer.FunctionalityX.DoIt();
您可以使用依赖注入(inject) 库,而不是从头开始实现,例如Unity .这还允许您在需要时更轻松地获取正确功能的实例,而不必在程序开始时创建它们,也无需为所有功能编写详尽的构造函数代码。
关于c# - 比 if(something) Do It() else Don't() 更好的架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32165995/