2017-01-23 14 views
2

TLDR: Как повторно использовать или создать экземпляр нового объекта Sql Connection в моих привязках Ninject? **** Второе связывание терпит неудачу **** из-за того, что SqlConnection не инициализируется. Я предполагаю, что не могу разделить соединение sql через несколько привязок?Повторное использование SqlConnection в нескольких привязках к ninject

У меня есть Sql репозиторий в этой схеме:

public class SqlRepository<T> : DataConnection, IRepository<T> where T : new() { 
    public SqlRepository(IDbConnection connection) : base(connection) 
} 

DataConnection принимает IDbConnection и возвращает объект Connection:

public class DataConnection : IDisposable { 
    private IDbConnection _connection; 

    public DataConnection(IDbConnection connection) { 
     this._connection = connection; 
    } 

    protected IDbConnection Connection { 
     get { 
      if(_connection.state != ConnectionState.Open && _connection.state != ConnectionState.Connecting) 
       _connection.Open(); 

      return _connection; 
     } 
    } 
} 

Я повторно использовать его в двух местах в одном из мои классы, в зависимости от того, какой аргумент типа передан, но соединение такое же:

public class WidgetsProvider { 
    private readonly IRepository<Widget> _widgetsRepo; 
    private readonly IRepository<Credential> _credentialRepo; 

    public WidgetsProvider(IRepository<Widget> widgetsRepo, IRepository<Credential> credentialRepo) { 
     _widgetsRepo = widgetsRepo; 
     _credentialRepo = credentialRepo; 
    } 
} 

Вот мои привязки:

public class WidgetIocModule : Ninject.Modules.NinjectModule { 
    public override void Load() { 
     //get the sql connection 
     var sql = new SqlConnection(ConfigurationManager.ConnectionStrings["widgetsConn"].ToString()); 

     //bind to repos 
     Bind<IRepository<Widget>>().To<SqlRepository<Widget>>().InSingletonScope().WithConstructorArgument("connection", sql); 
     Bind<IRepository<Credential>>().To<SqlRepository<Credential>>().InSingletonScope().WithConstructorArgument("connection", sql); 
    } 
} 

ответ

2

Создать привязку для SqlConnection, а не инстанцирование одно:

Bind<SqlConnection>().ToConstant(new SqlConnection(ConfigurationManager.ConnectionStrings["widgetsConn"].ToString())); 

Bind<IRepository<Widget>>().To<SqlRepository<Widget>>().InSingletonScope().WithConstructorArgument("connection", context => Kernel.Get<SqlConnection>()); 
Bind<IRepository<Credential>>().To<SqlRepository<Credential>>().InSingletonScope().WithConstructorArgument("connection", context => Kernel.Get<SqlConnection>()); 
+0

Я не уверен, что происходит, но во второе затруднительного, я m получение ошибки '' ((System.Data.SqlClient.SqlConnection) _connection) .ServerVersion 'выбрасывает исключение типа «System.InvalidOperationException». – Kyle

+0

Возможно, это связано с тем, что я вызываю функции, требующие db внутри запроса linq. 'InvalidOperationException' говорит {" Свойство ConnectionString не было инициализировано. "} После первых нескольких успешных вызовов. – Kyle

+0

Doh! Это правильный ответ (принято). Другая проблема связана с моими использованиями (use {) {} 'для размещения и закрытия соединений. – Kyle

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

  • Нет связанных вопросов^_^