Лучший механизм создания соединения по моему опыту - это комбинация DependencyInjection
и ConnectionFactory
.
Преимущества являются нескольких раз:
- Создание объекта соединения во время выполнения в транзакции или нить объем
- при изменении среды выполнения провайдера данных и, таким образом, базы данных системы (используя Factory Connection)
Что вы будете делать (в коде):
Объявите IDBConnection
объект в слой доступа к данным:
[Inject] // Property Injection
public IDBConnection Connection {get; set;}
Объявить связывание с использованием рамки DI как Ninject:
Bind<IDBConnection>().ToMethod(ctx =>
ConnectionFactory.CreateDbConnection("DefaultConnection"));
Создание DBConnection завода следующим образом :
завод Connection выбирает поставщик подключения и строку подключения из конфигурационного файла следующим образом:
<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=<Value>;Initial Catalog=<Value>;User Id=<Value>;Password=<Value>" providerName="System.Data.SqlClient" />
</connectionStrings>
идентификатор DefaultConnection
, который использует поставщик SqlClient, но время выполнения может быть изменен на другой клиент, как Oracle, MySql
using System;
using System.Data.Common;
public static class ConnectionFactory
{
/// <summary>
/// Create DBConnection type based on provider name and connection string
/// </summary>
/// <param name="connectionIdentifier"></param>
/// <returns></returns>
public static DbConnection CreateDbConnection(string connectionIdentifier)
{
// Provider name setting
var providerNameValue = ConfigurationManager.ConnectionStrings[connectionIdentifier].ProviderName;
// Connection string setting
var connectionStringValue = ConfigurationManager.ConnectionStrings[connectionIdentifier].ConnectionString;
// Assume failure.
DbConnection connection;
// Null connection string cannot be accepted
if (connectionStringValue == null) return null;
// Create the DbProviderFactory and DbConnection.
try
{
// Fetch provider factory
var factory = DbProviderFactories.GetFactory(providerNameValue);
// Create Connection
connection = factory.CreateConnection();
// Assign connection string
if (connection != null)
connection.ConnectionString = connectionStringValue;
}
catch (Exception ex)
{
connection = null;
}
// Return the connection.
return connection;
}
}
Как использовать:
Для одного вызова и распоряжаться
using(Connection)
{
...
}
Для контекста транзакции, использовать как есть, не using
не требуется
Не повторно использовать объект, всегда создают новый или вы столкнетесь с некоторыми странными проблемами параллелизма. Так что создавайте его все время или вводите (т.DI) – DavidG
Лучшим вариантом будет инжекция зависимостей вместе с Factory Factory, позаботится о инициализации объекта во время выполнения и может быть в транзакции или области потока –