Код такой:
var cs = ConfigurationManager.ConnectionStrings["MyConnectionString"];
var providerName = cs.ProviderName;
var factory = DbProviderFactories.GetFactory(providerName);
Для того, чтобы этот код работал, к программе должен прилагаться файл app.config,
который кем-то (кстати, кем?) переименовывается в MyApp.exe.config во время сборки.
Для того, чтобы этот код протестировать, создаётся .dll-ка с unit-тестами и запускается через nunit3-console:
nunit3-console MyTestDll.dll
NUnit запускает для теста отдельный процесс, а внутри создает отдельный AppDomain для этой .dll-ки
и загружает MyTestDll.dll.config
это в теории. А на практике:
# nunit3-console
bash: nunit3-console: command not found
в monodevelop:
вызываем контекстное меню на узле Solution в окне Solution Explorer:
выбираем тип проекта "NUnit Library Project"
жмём "Next"
Вводим название проекта в поле "Project Name:"
жмём "Create"
В полученном из шаблона проекте используется пакет (package) NUnit 2.6.3 (проапдейтим до 2.6.4)
Заготовка кода такая:
using NUnit.Framework;
using System;
namespace AdoNetConnectionTest.NUnit
{
[TestFixture ()]
public class Test
{
[Test ()]
public void TestCase ()
{
}
}
}
Добавляем код, запускаем, получаем
System.NullReferenceException : Object reference not set to an instance of an object
добавляем конфиг
System.ArgumentException : Unable to find the requested .Net Framework Data Provider. It may not be installed.
System.Configuration.ConfigurationErrorsException : Failed to find or load the registered .Net Framework Data Provider.
# gacutil -l deveeldb
The following assemblies are installed into the GAC:
deveeldb, Version=2.0.0.31533, Culture=neutral, PublicKeyToken=0738eb9f132ed756
Number of items = 1
<configuration>
<system.data>
<DbProviderFactories>
<add
invariant="MySql.Data.MySqlClient"
type="MySql.Data.MySqlClient.MySqlClientFactory,MySql.Data, Version=6.6.4.0, Culture=neutral, PublicKeyToken=C5687FC88969C44D"
name="MySQL Data Provider"
description=".Net Framework Data Provider for MySQL"
/>
<add
invariant="Deveel.Data.Client.DeveelDBClient"
type="Deveel.Data.Client.DeveelDBClientFactory,deveeldb, Version=2.0.0.31533, Culture=neutral, PublicKeyToken=0738eb9f132ed756
name="DeveelDB Data Provider"
description=".Net Framework Data Provider for DeveelDB"
/>
</DbProviderFactories>
</system.data>
</configuration>
System.InvalidOperationException : The requested .Net Framework Data Provider's implementation does not have an Instance field of a System.Data.Common.DbProviderFactory derived type.