2009-10-19 2 views
0

У меня есть приложение, которое проецирует данные для моего клиента на протяжении длительного времени. Чтобы позволить клиенту «играть» с другими сценариями без испорчения производственных данных, они могут выбирать альтернативные базы данных (в основном сценарии «Что-если») в любой момент, которые являются копией производственной базы данных по состоянию на определенное время. В настоящее время у меня есть бит кода, который в основном выполняет замену строки в строке подключения, которая будет «горячей» заменой имени сервера и имени базы данных на основе выбора пользователя, сохраненного в состоянии сеанса.Динамическая строка коннектора на основе переменной сеанса

Этот подход хорошо работает для того, что я делаю, хотя он требует, чтобы я проходил эти выборы во всех слоях. Вот мой вопрос: я хотел бы иметь возможность создать пользовательскую строку соединения, которая обрабатывала бы это «переключение» в фоновом режиме и позволяла мне использовать строку подключения так же, как в стандартном приложении Asp.Net.

Другими словами, многие инструменты asp.net принимают только имя строки соединения как часть своего конструктора. Я хотел бы иметь возможность использовать эти инструменты, но не могу сделать это b/c из того, как я в настоящее время строю свою строку соединения. Есть ли способ поддержать это поведение на уровне пользовательского сеанса?

ответ

0

Существует несколько различных способов борьбы с этим.

Некоторые люди имеют полные отдельные копии своих файлов web.config (где должны храниться строки (-и) подключения) и с помощью событий post-build они могут скопировать соответствующий файл web.config на основе «конфигурации выпуска» «вы используете в Visual Studio.

Этот метод был blogged about от Scott Gu, а также others.
Кроме того, увидеть этот StackOverflow вопрос:
How do you deal with connection strings when deploying an ASP.NET site?

Теперь, выше являются большие методы, когда первоначально развертывания вашего ASP.NET приложений, однако, если вы хотите сделать это, когда приложение уже развернуты, вы можете использовать этот удобный механизм: ConnectionString Trick

Это звучит, как вы делаете что-то очень похожее на это уже есть, и если вы хотите иметь возможность динамически переключаться с базами данных во время выполнения, я думаю, что лучше всего вы можете просто «переключить» строки подключения в свой код. Конечно, трюк здесь заключается в том, чтобы упростить это, так что только одно место в вашем приложении отвечает за предоставление строки подключения базы данных к остальной части вашего приложения.

Возможно, лучший способ справиться с этим - убедиться, что все значения, которые вы хотите получить из web.config, извлекаются с использованием класса, который происходит из класса System.Configuration.ConfigurationSection. Это позволит вам инкапсулировать любую логику (например, трюк «string string on-machine-name»), требуемый для «переключения» фактического значения, возвращаемого в одном месте, и позволяет вам использовать «connectionstring» вашего пользовательского класса "в конструкторе любого другого компонента, для которого требуется строка соединения в качестве параметра, без необходимости изменять это при изменении фактического значения строки соединения.

Некоторые хорошие ресурсы для разделов пользовательских конфигурации являются:

How to: Create Custom Configuration Sections Using ConfigurationSection
Creating Custom Configuration Sections in Web.config Using .NET 2.0's Configuration API
Custom Configuration Sections in 3 Easy Steps

+0

Спасибо за информативный комментарий! Я знаю о Trink Trick, но мой случай немного отличается. Мне нужна другая строка соединения на основе пользователя и, возможно, их выбор, из какой базы данных они хотят, чтобы приложение предназначалось. Другими словами, это не просто переключатель развертывания или параметр, который я могу установить во время Application_Start. Создание настраиваемого раздела конфигурации было бы идеальным, если бы я мог переопределить текущий раздел конфигурации строки подключения с моим собственным. Я ищу информацию, чтобы сделать это, но пока ничего не тяну. – Nathan

0

Кажется, как если бы вы могли бы просто назвать ваши строки соединения значительно, то обойти, что значительное имя: производство, испытание, Etc

Вашего web.config может иметь все строки соединения в нем, то вы просто получить строку подключения на основе имени.

<add name="Production" connectionString="Database=Widgets;Server=SQL-PROD;Trusted_Connection=yes" /> 
<add name="Test" connectionString="Database=AltWidgets;Server=SQL-TEST;Trusted_Connection=yes" /> 

Когда вы делаете подключение, просто передать его:

SqlConnection conn = new conn(ConfigurationManager.ConnectionStrings[Session["SelectedDB"]].ToString()); 
+0

Я рассмотрел этот подход, однако, процесс порождения «что если» находится вне моего контроля и Я бы не хотел, чтобы вручную добавлять эти настройки для каждого икры. Это хороший подход, хотя я сохраняю его как последнее средство. – Nathan

0

Вы можете создать пользовательский объект, переопределить метод ToString, и передать myObject.ToString() в качестве параметра для этих объектов , например.

class CustomObject 
{ 
    override public string ToString() 
    { 
     // In here would go whatever logic you use to decide 
     // which conn string should be returned 
     return "Data Source=server; User ID=user; Password=password;" + 
        "Initial Catalog=" + Session["DBName"]; 
    } 
} 

Затем, чтобы использовать его:

CustomObject co = new CustomObject(); 
SqlConnection conn = new SqlConnection(co.ToString()); 
+0

Это очень похоже на тот подход, который я сейчас делаю. К сожалению, я не думаю, что это сработает с текущей ситуацией. Многие объекты принимают имя строки подключения (в отличие от строки подключения) как параметр, который в основном выводит его из моего контроля. – Nathan

+0

Вы можете сделать то же самое, но вместо того, чтобы возвращать строку соединения, верните имя строки подключения? Какие объекты вы имеете в виду, которые принимают имя строки? Являются ли эти пользовательские объекты или встроены в элементы управления ASP.Net? –

+0

Это элементы управления asp.net, такие как объект Asp.Net SqlCacheDependency, который принимает зарегистрированное имя в схеме (которое затем ссылается на имя строки подключения). Если бы я сделал то же самое с именем строки подключения, мне пришлось бы иметь каждый экземпляр строки подключения, зарегистрированный в файле web.config, а не динамический. Это очень похоже на предложение JustLoren. – Nathan

0

Я думаю, System.Data.SqlClient.SqlConnectionStringBuilder будет идеально подходит для ваших нужд.

+0

Это очень похоже на мою текущую реализацию, однако, она не соответствует моей текущей потребности. В основном, я пытаюсь использовать элементы управления, которые принимают имя строки подключения как часть своего конструктора, который берет часть сборки строки подключения из моей руки. Я хотел бы переопределить процесс построения по умолчанию в соответствии со своими собственными целями, но я не уверен, как это можно сделать. Имеет ли это смысл? – Nathan

Смежные вопросы