具有级联属性的配置



在.net中是否可以执行类似于实现可重写/情景配置属性的操作?

示例:假设我的系统配置中有一个URL,但根据特定的上下文或调用方,URL可能会有所不同。以银/金/白金为例。相同的配置会有这样的内容:Url_标准:"www.standard.com";Url_Gold:"www.gold.com";etc

我想要一个强类型的配置,这样我就可以简单地根据AppSettings.Url进行编程,而不是AppSettings.Url_Standard、AppSettings.Ull_Gold等。

目前,我处理这一问题的方法是使用一个configurationHelper,它的方法看起来像GetUrl(string entityContext(,在其中,我可以确定返回什么值。问题是,这会为配置中的几乎每个属性创建一个ConfigHelper类和一个方法。丑陋,SRP问题,OCP问题。我更喜欢一个强类型的配置类,它的行为方式相同,并且去掉了魔术字符串。可以直接调用AppSettings.Url(并且知道它会返回给我最具体的一个(。我看不出有任何方法可以绕过参数或泛型,因为单独的调用传递上下文。这不能仅在启动时加载/计算。

设计理念?

在我看来,您可以使用Dicitonary<TKey, TValue>来存储配置键的处理程序。所以当添加新密钥时,它将只是一个应该编辑的地方。并将遵守单一责任原则。此外,其他类别将遵守开放-关闭原则。

让我通过C#展示一个例子。这是我们对配置处理程序的抽象:

public interface IConfigHandler
{
void Handle(string value);
}

具体实施:

public class UrlHandler : IConfigHandler
{
public void Handle(string value)
{
// your logic here to handle "standard", "gold", "etc"
}
}

在这里,您将添加新的配置处理程序。这就像一个简单的工厂:

public class ConfigHandlerFactory
{
private Dictionary<string, IConfigHandler> _handlerByKeyOfConfig =
new Dictionary<string, IConfigHandler>()
{
{ "url", new UrlHandler() }
};
public IConfigHandler GetInstance(string key) =>
_handlerByKeyOfConfig[key];
}

所以我们工厂只有一个处理程序UrlHandler。这里UrlHandler是一种处理配置密钥的策略。因此,您可以在这个工厂ConfigHandlerFactory中添加新的策略。所以,我们在这里应用了策略模式。

然后你可以这样调用你的代码:

ConfigHandlerFactory configHandlerFactory = new ConfigHandlerFactory();
string urlKey = "url"; // you can create a class with keys to avoid magic strings
IConfigHandler configHandler = configHandlerFactory.GetInstance(urlKey);
configHandler.Handle("www.gold.com");

最新更新