gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:50:12 25 4
gpt4 key购买 nike

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com