我有一个这样的代码:
// 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“的值在应用程序启动时设置一次。我需要动态地去做。
发布于 2016-01-15 17:43:55
在MVC中,为了简化测试和模拟,我倾向于对所有通过接口引用的公共类使用自定义对象,如Request、Session和ConfigManager。显然,你基本上不需要从头开始实现类,所以你的实现可以是一个包装器,它实际上在幕后使用了.net类,但它也提供了在中间插入一些自定义逻辑的机会,就像你的例子一样。
因此,您可以使用像GetAppConfig( webconfigurationManager )这样的包含您自己的逻辑的方法来创建密钥的包装器。然后,使用依赖注入的概念就足够简单了,让这个类在您需要的任何地方都可以使用。
因此,举个简单的例子:
//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;
}
}这种方法的最大优点是,如果您想要将配置存储在数据库或服务中,并更改代码,则只需更改接口实现并注入新实例。
发布于 2011-10-27 22:26:41
在从web.config检索值之后,您似乎需要执行一些逻辑操作。如果逻辑修改了值本身,则始终可以在web.config中存储格式字符串。
下面是一个使用连接字符串设置的示例。我使用格式字符串在运行时填充服务器名称:
<add name="sqlconnection" connectionString="Server={0}\SQLEXPRESS;Database=xxx;Trusted_Connection=True;"/> 然后我使用这个逻辑:
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;编辑:如果你不能直接编辑这个类,我可以考虑创建一个分部类来实现它。
发布于 2011-10-28 11:06:19
如果您不能更改正在读取AppSettings的代码,那么就没有办法做您想做的事情。WebConfigurationManager不能在外部插入或更换。
您必须更改代码。
https://stackoverflow.com/questions/7914092
复制相似问题