首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在执行过程中动态覆盖WebConfigurationManager.AppSettings["SomeProperty"]

在执行过程中动态覆盖WebConfigurationManager.AppSettings["SomeProperty"]
EN

Stack Overflow用户
提问于 2011-10-27 17:35:32
回答 5查看 1.1K关注 0票数 0

我有一个这样的代码:

代码语言:javascript
复制
// can't make any changes at that class
class MyClass
{
    void SomeMethod()
    {
        // some code ...

        var someVar = WebConfigurationManager.AppSettings["SomeProperty"];

        // some code ...
    }
}

我不能更改该代码,但我需要WebConfigurationManager.AppSettings"SomeProperty“根据一些外部条件(例如,根据用户角色)返回不同的值。因此,我正在寻找某种方法来覆盖对该属性的访问。在override方法中,我将检查用户角色并返回适当值。

有没有办法做到这一点?

我发现了这个问题:Is there a way to override ConfigurationManager.AppSettings?,但它似乎不适合我,因为这里WebConfigurationManager.AppSettings"SomeProperty“的值在应用程序启动时设置一次。我需要动态地去做。

EN

回答 5

Stack Overflow用户

发布于 2016-01-15 17:43:55

在MVC中,为了简化测试和模拟,我倾向于对所有通过接口引用的公共类使用自定义对象,如Request、Session和ConfigManager。显然,你基本上不需要从头开始实现类,所以你的实现可以是一个包装器,它实际上在幕后使用了.net类,但它也提供了在中间插入一些自定义逻辑的机会,就像你的例子一样。

因此,您可以使用像GetAppConfig( webconfigurationManager )这样的包含您自己的逻辑的方法来创建密钥的包装器。然后,使用依赖注入的概念就足够简单了,让这个类在您需要的任何地方都可以使用。

因此,举个简单的例子:

代码语言:javascript
复制
//this will be injected
public MyControllerCtor(IConfig cfg)

public interface IConfig
{
   string GetAppConfig(string key);
}

public class myConfig:IConfig
{
   public string GetAppConfig(string key)
   {    
      //your logic
      var someVar = WebConfigurationManager.AppSettings["SomeProperty"];
      //your logic

      return yourCustomAppSetting;
   }
}

这种方法的最大优点是,如果您想要将配置存储在数据库或服务中,并更改代码,则只需更改接口实现并注入新实例。

票数 1
EN

Stack Overflow用户

发布于 2011-10-27 22:26:41

在从web.config检索值之后,您似乎需要执行一些逻辑操作。如果逻辑修改了值本身,则始终可以在web.config中存储格式字符串。

下面是一个使用连接字符串设置的示例。我使用格式字符串在运行时填充服务器名称:

代码语言:javascript
复制
<add name="sqlconnection" connectionString="Server={0}\SQLEXPRESS;Database=xxx;Trusted_Connection=True;"/>    

然后我使用这个逻辑:

代码语言:javascript
复制
string connect = ConfigurationManager.ConnectionStrings["sqlconnection"].ConnectionString;
if (!String.IsNullOrEmpty(connect))
{
    //check to see if the connection string needs to be set at runtime
    if (connect.Contains("{0}"))
        connect = String.Format(connect, HttpContext.Current.Server.MachineName);
}

return connect;

编辑:如果你不能直接编辑这个类,我可以考虑创建一个分部类来实现它。

票数 0
EN

Stack Overflow用户

发布于 2011-10-28 11:06:19

如果您不能更改正在读取AppSettings的代码,那么就没有办法做您想做的事情。WebConfigurationManager不能在外部插入或更换。

您必须更改代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7914092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档