Все свои конфиги я обычно храню в реестре. Несмотря на то, что я начал использовать LINQ, я не хотел бы иметь DSN в файле web.config, а хотел бы, чтобы он оставался в реестре и прикреплял его (возможно, в событии запуска приложения) к системной конфигурации.
Как это может быть сделано?
Спасибо за любые идеи!
изменить: чтобы было понятно: я не хочу писать в файл web.config, я просто хочу сохранить dsn (зашифрованный) где-нибудь еще, кроме web.config, поэтому у меня один и тот же web.config на всех этапах разработки (локальный, staginf, живой, резервный).
Кристоф
Код решения в VB.Net:
1) Добавьте новый класс с одним методом, который наследуется от исходного Datacontext:
Public Class MyDatabaseDataContext
Inherits DatabaseDataContext
Public Sub New()
MyBase.New(Settings.DSN)
End Sub
End Class
2) Используйте этот класс во всех источниках данных Linq вместо исходного контекста.
ContextTypeName = "MyProject.MyDatabaseDataContext





Почему бы просто не сохранить его в зашифрованном виде в файле web.config? Если вы не хотите использовать Application_Start, довольно легко зашифровать только строки подключения в web.config на aspreg_iis. Вы даже можете впоследствии отредактировать зашифрованный файл web.config с помощью инструмента администрирования IIS.
Configuration config = WebConfigurationManager.OpenWebConfiguration(
HttpContext.Current.Request.ApplicationPath );
ConfigurationSection section = config.Sections["connectionStrings"];
if (!section.SectionInformation.IsProtected
&& !GlobalConfiguration.ApplicationVersion.EndsWith( "dev" )) // don't encrypt dev
{
section.SectionInformation.ProtectSection( "DataProtectionConfigurationProvider" );
config.Save();
}
Если вы должны сохранить его в реестре. Вы всегда можете использовать конструктор DataContext, который принимает строку подключения и передает значение, которое вы читаете из реестра. Предположительно, вы сохраните это в магазине приложений, поэтому вам нужно будет прочитать из реестра только один раз.
У Скотта Гатри есть хорошая страница использованная литература для шифрования вашей веб-конфигурации, хотя в большинстве примеров используется aspreg_iis. Я предпочитаю делать это на Application_Start, поэтому не забываю случайно зашифровать.
Я уже использовал перезапись конструктора DataContext, но у этого есть 2 проблемы: мне нужно удалить конструктор по умолчанию в DB.designer.vb, и каждый раз, когда я меняю dbml, конструктор в DB.designer.vb повторно -созданный.
Нет ли способа инициализировать DataContext с помощью настраиваемого DSN при запуске приложения?
Вам не нужен единый DataContext на протяжении всего жизненного цикла вашего приложения. Создавайте их по мере необходимости.
Вот что я делаю. У меня есть базовый класс для моего DataContext. Он называется DataContextBase и создается sqlmetal.exe. У меня есть производный класс DataContext, который используется в моих вызовах Linq. Выглядит это так:
public class DataContext : DataContextBase
{
public DataContext()
: base(ConnectionHolder.ConnectionString)
{
}
}
В моей библиотеке есть статический класс ConnectionHolder, в котором хранится строка подключения:
public static class ConnectionHolder
{
static string _ConnectionString;
public static string ConnectionString
{
get { return _ConnectionString; }
set { _ConnectionString = value; }
}
}
(примечание: это отдельно от DataContext, потому что в моем приложении есть места за пределами Linq, в которых я использую строку подключения). При запуске приложения я говорю ConnectionHolder.ConnectionString = (где бы вы ни хранили строку подключения).
Это довольно разумное требование при работе с устаревшим кодом.
Класс DataContext - это частичный класс, поэтому я просто добавляю статический фабричный метод, который загружает параметр конфигурации и создает результат datacontext.
Какой метод добавить? В DB.designer.vb уже существует общедоступная подпрограмма new, поэтому, если добавить общедоступную подпрограмму new в мой DB.vb, я получаю дублирующуюся ошибку определения функции. Если я удалю этот метод в DB.designer.vb, все будет работать нормально, но если отредактировать dbml, sub каждый раз воссоздается ...
Лучше не пытаться бороться с системой и перейти к файлам конфигурации, настраиваемым блокам конфигурации и классам настроек, поскольку фреймворк поощряет это. Это уже не VB6;)