c# - 比 if(something) Do It() else Don't() 更好的架构

标签 c# .net sql-server api infrastructure

我正在尝试创建一种机制,允许应用程序决定(在运行时)是否执行某些功能。

“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/

相关文章:

c# - 设置AllowAutoRedirect = false仍然遵循重定向

SQL Group By 对创建的列进行分组?

sql - 如何使用 SQL 查询将 SQL 表分成两半并将另一半行发送到新列?

sql-server - 如何正确比较 SQL Server 中的两个可为 null 的 BIT 值?

c# - 从类型创建类实例

c# - 如何首先在 Entity Framework 代码中为每种类型配置多个对象集

c# - Json.net:序列化/反序列化不适用于具有循环引用的 ISerializable 对象

c# - 仅在填充后重新排序 TreeView 节点 [0]

.net - 错误 23 不是 .resx 文件上的有效 Win32 应用程序

c# - 从具有整数值的 jwt 有效负载解码编码的 JSON 字符串时,Convert.FromBase64string 抛出无效的 Base-64 异常