Ссылка на одну и ту же строку подключения в нескольких приложениях .NET - PullRequest
0 голосов
/ 30 ноября 2018

Я не уверен, что это правильный носитель для этого вопроса, поэтому, если это не так, пожалуйста, сообщите мне, и я исправлю.

В качестве примера, иллюстрирующего мою точку зрения, допустим, у меня есть 30.NET приложения, которые публикуются на 2-3 разных веб-серверах.Теперь эти приложения основаны на интрасети, поэтому у меня есть библиотека C #, на которую я ссылаюсь в каждом из этих приложений.Эта библиотека состоит из методов, которые я использую в каждом приложении, чтобы при необходимости узнать информацию о сотруднике.Теперь в библиотеке есть одна строка подключения, но тогда я должен также сослаться на эту же строку подключения во всех 30 приложениях ... поэтому, если база данных изменяется, на которую ссылается библиотека, то я должен запомнить все 30 приложений и изменитькаждый из них в отдельности.

Есть ли способ поместить строку подключения в какой-то файл (текстовый файл или что-то в этом роде), и каждый web.config в каждом из 30 приложений ссылается на этот конкретный файл,поэтому, если нужно изменить строку подключения, я могу просто изменить ее в файле, и тогда все 30 приложений по-прежнему в порядке, или что-то не так?

ОБНОВЛЕНИЕ

Хорошо, теперь я знаю, как ссылаться на текстовый файл для целей строки подключения. , но , кажется, что я могу сделать только один из двух вариантов ... либо ссылаться на мою основную строку подключенияи строку подключения к библиотеке индивидуально в файле web.config, например, так:

ОПЦИЯ ONE

<connectionStrings>
  <add name="PrimaryCS" // more data />
  <add name="LibraryCS" // more data />
</connectionStrings>

Эта опция потребовала бы от меня изменения строки подключения LibraryCS в каждом из 30 приложений, если бы она когда-либо изменялась (НЕ ЧТО Я ХОЧУ)

ОПЦИЯTWO

<connectionStrings configSource="MyConfig.config"></connectionStrings>

Эта опция заставляет меня помещать обе строки подключения в файл MyConfig.config, а не только в файл LibraryCS .., так что это приведет к тому, что мне придется изменитьLibraryCS строка подключения в каждом файле MyConfig.config для каждого из 30 приложений (СНОВА, НЕ ТО, ЧТО Я ХОЧУ).

ЧТО Я ИЩУ

Я ищу смесь двух вариантов, но, кажется, это невозможно, поэтому я надеюсь, что кто-то на этом носителе знает обходной путь

<connectionStrings configSource="MyConfig.config">
  <add name="PrimaryCS" // more data />
</connectionStrings>

Я хочу, чтобы файл MyConfig.config содержал только строку подключения LibraryCS, а затем содержал бы главную строку подключения PrimaryCS отдельно ... так что если когда-либо нужно было изменить строку подключения LibraryCS, то я тольконужно сделать это в одном месте.

Ответы [ 5 ]

0 голосов
/ 08 декабря 2018

Рассматривали ли вы использование Apache Zookeeper ?Кажется, ваш вариант использования соответствует его определению:

ZooKeeper - это централизованный сервис для обслуживания информации о конфигурации ...

Вы можете где-нибудь запустить экземпляр ZooKeeper и сохранить его вэто ваши настройки конфигурации.Ваши настройки будут организованы в структуру, аналогичную структуре файловой системы.Это может выглядеть так (используя zkCli.sh, который поставляется с ZooKeeper для создания конфигурации, например):

create /common-settings
create /common-settings/connectionString 1.1.1.1:123
...
create /app-1-settings
create /app-1-settings/app-specific-setting myArbitrarySetting 

Затем вы можете настроить свои приложения на включение клиента ZooKeeper, чтобы онив состоянии прочитать конфигурацию, которую вы сохранили.Для .NET я нашел https://github.com/shayhatsor/zookeeper,, который, похоже, тщательно имитирует Java-клиента: https://github.com/ewhauser/zookeeper.Я не использовал его широко, но я получил следующую работу (примечание C # 7.1+, из-за async Main ()):

using System;
using System.Text;
using System.Threading.Tasks;
using org.apache.zookeeper; // NuGet: ZooKeeperNetEx

namespace Example 
{
    // Watcher will notify us of events we get from ZooKeeper
    class MyWatcher : Watcher 
    {
        public override async Task process(WatchedEvent @event)
        {
            Console.WriteLine($"Process event: {@event}");
        }
    }   

    class Program 
    {
        async static Task Main()
        {
            // Create a new ZK client.
            var zookeeper = new ZooKeeper("<zookeeper-url>", sessionTimeout: 3000, new MyWatcher());
            // Use it to request a config setting.
            var connectionData = await zookeeper.getDataAsync("/common-settings/connectionString");
            // Convert the received data from bytes to string.
            var connectionString = Encoding.UTF8.GetString(connectionData.Data);

            Console.WriteLine($"Got connectionString '{connectionString}'."); // Got connectionString '1.1.1.1:123'
            Console.Read();
        }
    }
}

Я уверен, что без особых усилий вы можете адаптировать его кваши конкретные потребности.Чтобы начать работу с ZooKeeper, вы можете изучить их Getting Started .Конечно, в интернете тоже много информации.

0 голосов
/ 07 декабря 2018

Не знаю, ищите ли вы это, но когда вы перегружаете конструктор вашего ApplicationDbContext, вы можете указать, какую строку соединения он должен использовать:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext() : base(GetConnectionStringName(), throwIfV1Schema: false)
    {
    }

    static string GetConnectionStringName()
    {
         // Your logic for the connectionstring, I use the Request.Url here.
         return HttpContext.Current.Request.Url.Authority.ToLower().Split(new char[] { ':' }).FirstOrDefault().Replace("www.", "");
    }
}
0 голосов
/ 04 декабря 2018

Отличное решение - добавить ярлыки конфигурационных файлов в другие проекты, поэтому вы обновляете только один файл: enter image description here

Это похоже на общий доступ к файлам сборки (демонстрация в ответе № 2): https://stackoverflow.com/a/15319582/495455)

Если вам нужно больше сред, используйте преобразования:

enter image description here

Я знаю, что это короткий ответ,Мне нравятся действительно простые решения. Дайте мне знать, если у вас есть какие-либо вопросы.

0 голосов
/ 04 декабря 2018

У Microsoft есть удивительная документация об этом.Надеюсь, это поможет.

Чтобы сохранить строки подключения во внешнем файле конфигурации, создайте отдельный файл, который содержит только раздел connectionStrings.Не включайте никаких дополнительных элементов, разделов или атрибутов.В этом примере показан синтаксис для внешнего файла конфигурации.

<connectionStrings>  
  <add name="Name"   
   providerName="System.Data.ProviderName"   
   connectionString="Valid Connection String;" />  
</connectionStrings>

В основном файле конфигурации приложения вы используете атрибут configSource, чтобы указать полное имя и местоположение внешнего файла.,Этот пример ссылается на внешний файл конфигурации с именем connections.config.

<?xml version='1.0' encoding='utf-8'?>  
<configuration>  
    <connectionStrings configSource="connections.config"/>  
</configuration>

Источник: https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/connection-strings-and-configuration-files

0 голосов
/ 30 ноября 2018

Одним из решений, которое я предложил, является создание файла строки общего подключения и ссылка на него в файле web.config нескольких проектов веб-приложений.

Итак, в моих веб-конфигах у меня есть это:

<connectionStrings configSource="configs\connectionStrings.local.config">

Этот файл просто содержит часть конфигурации 'connectionStrings'.

И я копирую в connectionStrings.Файл local.config в папку config при сборке проекта из общей папки решения (файл конфигурации добавляется в решение в качестве элемента решения.

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

...