2016-10-27 6 views
4

Большинство Dapper учебники использовать частный IDBConnection объект для вызова методов, т.е.Где следует указывать IDBConnection, чтобы уменьшить повторяющийся код?

private IDbConnection db = new SqlConnection(...) 

При использовании ASP.NET и MVC 5, где я должен поставить это, так что я не должен повторить в каждом контроллере/хранилище с помощью щеголеватый ? Например, есть ли способ поместить это в класс запуска и использовать инъекцию зависимостей, как в ASP.NET Core, или какую-либо другую технику для доступа к ней во всем приложении?

+1

Не повторно использовать объект, всегда создают новый или вы столкнетесь с некоторыми странными проблемами параллелизма. Так что создавайте его все время или вводите (т.DI) – DavidG

+0

Лучшим вариантом будет инжекция зависимостей вместе с Factory Factory, позаботится о инициализации объекта во время выполнения и может быть в транзакции или области потока –

ответ

1

Лучший механизм создания соединения по моему опыту - это комбинация 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 не требуется