Вы не можете просто сказать ELMAH что-то сделать с вашей строкой соединения.Однако вы можете попросить ELMAH перезвонить вам, когда ему понадобится ErrorLog
, что даст вам больше контроля во время выполнения.Затем вы можете прочитать зашифрованную строку подключения, расшифровать ее с помощью собственной функции и вернуть инициализированный с ней SqlErrorLog.
Для этого вам необходимо предоставить метод, совместимый с ServiceProviderQueryHandler
делегат.Вот определение:
public delegate IServiceProvider ServiceProviderQueryHandler(object context);
Реализация метода должна возвращать экземпляр объекта, который реализует IServiceProvider
.Если вы не хотите писать самостоятельно, вы можете получить его бесплатно в .NET Framework.См. System.ComponentModel.Design.ServiceContainer
.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;
} ;
Это захватывает текущую точку обслуживания и устанавливает вместо нее вашу собственную.Когда лямбда / делегат передает запросы на обслуживание захваченной точке обслуживания, когда она не может удовлетворить ее напрямую, создается цепочка.Вы рассказываете ELMAH о своей реализации, устанавливая ServiceCenter.Current
где-то во время инициализации вашего приложения, так что именно там должен находиться приведенный выше код.
Помните, что это очень простая реализация, но она должна быть хорошейДостаточно, чтобы начать и оптимизировать позже, если это необходимо.
До этого добавления в 1.2 , единственный способ сделать что-то подобное требовал подклассов и другой гимнастики и все еще давал частичные результаты.Теперь вам просто нужно реализовать метод и передать его ELMAH, который просто отвечает на запросы ELMAH для объектов на основе их типа обслуживания.