您不能只是告诉 ELMAH 对您的连接字符串执行某些操作。然而,您可以做的是告诉 ELMAH 在需要时给您回电ErrorLog
,让您在运行时拥有更多控制权。然后,您可以读取加密的连接字符串,使用内部函数对其进行解密,并返回用它初始化的 SqlErrorLog。
为此,您需要提供一个与以下兼容的方法
这ServiceProviderQueryHandler http://code.google.com/p/elmah/source/browse/tags/REL-1.2/src/Elmah/ServiceCenter.cs#34代表。定义如下:
public delegate IServiceProvider ServiceProviderQueryHandler(object context);
该方法的实现必须返回实现该方法的对象的实例IServiceProvider
。如果您不想自己编写一个,可以从 .NET Framework 免费获取一个。看。服务提供商的GetService
必须响应请求ErrorLog
输入,然后您可以,例如,返回SqlErrorLog
已使用运行时操作的连接字符串初始化的对象。这是一个可能的实现:
var parent = ServiceCenter.Current;
ServiceCenter.Current = context => {
var container = new ServiceContainer(parent(context));
var connectionSettings = ConfigurationManager.ConnectionStrings["FOOBAR"];
var connectionString = Decrypt(connectionSettings.ConnectionString);
var log = new SqlErrorLog(connectionString);
container.AddService(typeof(ErrorLog), log);
return container;
} ;
这将捕获当前的服务点并安装您自己的服务点。创建的 lambda/委托在无法传递服务请求时将其传递到捕获的服务点
直接满足它,从而创建一条链。您通过设置告诉 ELMAH 您的实施情况ServiceCenter.Current
在应用程序初始化期间的某个位置,因此这就是上面的代码需要所在的位置。
请记住,这是一个非常简单的实现,但它应该足以帮助您入门并在以后需要时进行优化。
在此之前1.2 中的补充 http://code.google.com/p/elmah/issues/detail?id=149,做类似事情的唯一方法需要子类化和其他体操,并且仍然产生部分结果。现在您只需实现一个方法并将其交给 ELMAH,该方法只需根据对象的服务类型响应 ELMAH 对对象的查询。