2

Я хочу нанести на карту DbConnection до незакрытого SqlConnection, используя Ninject. Это то, что я сделал:Ninject: Предоставьте открытое SqlConnection при запросе на DbConnection

string constr = @"Server=.\SQLEXPRESS; Trusted_Connection=True; Database=TestDB"; 

Bind<DbConnection>().To<SqlConnection>() 
    .Using<OnePerRequestBehavior>() 
    .WithConstructorArgument("connectionString", constr); 

Однако при попытке использовать дб я получаю ошибку о том, что

Эта операция требует подключения к базе данных «мастер». Не удалось создать соединение с базой данных «master», поскольку исходное соединение с базой данных было открыто и учетные данные были удалены из строки подключения. Обеспечьте нераскрытое соединение.

(Та же операция работает, если я просто обеспечить связь с new SqlConnection(constr) ...)

Оказывается QueryString свойства SqlConnection я давался Ninject пусто. Что я делаю не так?


UPDATE

Я теперь протестирован с kernel.Get<DbConnection>() непосредственно после связывания, и с вышеуказанным кодом он все еще дает мне пустую строку подключения. Следующие работы, хотя это более многословным, чем я хочу это:

Bind<DbConnection>().ToMethod<SqlConnection>(ctx => GetConnection()); 

private SqlConnection GetConnection() 
{ return new SqlConnection(constr); } 

UPDATE 2

Это весь мой модуль:

public class MsSqlModule : StandardModule 
{ 
    private string constr = @"Server=AASLOEG\SQLEXPRESS; Trusted_Connection=True; Database=Booking_Test";// System.Configuration.ConfigurationManager.ConnectionStrings["mssql"].ConnectionString; 

    public override void Load() 
    { 
     Bind<DbConnection>().To<SqlConnection>().WithConstructorArgument("connectionString", constr); 
     var test = Kernel.Get<DbConnection>(); 
     test.Dispose(); 
    } 
} 

С точки останова на var test = Kernel.Get<DbConnection>(); и перешагнув, я вижу, что test заселен SqlConnection, но ConnectionString pro perty пуст.

+0

Вы не имеете в виду '** Query ** String' вы? –

+0

Это единственный звонок, который вы получили? не вижу, как 'Get ()' может не передать аргумент arg [и выбрать нестандартную перегрузку ctor], если это так. –

+0

Вы уверены, что 'constr' инициализируется в точке« Bind »? –

ответ

0

Я в конечном итоге решил это, создав пользовательский поставщик и привязанный к нему. (Я также повышен до Ninject 2.0, которые могут повлиять на результаты ...)

public class MsSqlConnectionProvider : DbConnectionProvider<SqlConnection> 
{ 
    public string ConnectionString { get { return TestConnectionString; } } 
    public string ConnectionStringFromConfigFile { get { return System.Configuration.ConfigurationManager.ConnectionStrings["mssql"].ConnectionString; } } 
    public string TestConnectionString { get { return @"Server=AASLOEG\SQLEXPRESS; Trusted_Connection=True; Database=Booking_Test"; } } 

    protected override SqlConnection CreateInstance(IContext context) 
    { 
     return new SqlConnection(ConnectionString); 
    } 
} 

public class MsSqlModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<DbConnection>().ToProvider<MsSqlConnectionProvider>(); 
    } 
} 
0

Код, который у вас есть, кажется прекрасным, и Ninject должен либо громко использовать привязку, либо громко, если вы запрашиваете DBConnection.

Вы уверены, что ImplicitSelfBinding не входит в систему? Можете ли вы отключить его в yout Module? (Но вам нужно будет вводить SqlConnection, чтобы это произошло).

Что произойдет, если вы выполните Get<DBConnection>() сразу после вашей линии Bind?

+0

Я обновил свой вопрос с результатами. Как я могу управлять ImplicitSelfBinding? (Но нет, я вводил «DbConnection» ...) –

+0

ImplicitSelfBindingDefault передается в модуль (или это ядро ​​или обе?). Вы можете видеть, что такое состояние, глядя на подсказку ImplicitSelfBinding модуля. Это означает, что класс X привязан к X. (т. Е. Он, вероятно, не имеет ничего общего с вашим случаем - если он был включен, и у вас не было Bindings, тогда Ninject позволит вам получить SqlConnection, и он будет построен по умолчанию. вы определенно решаете DBConnection, он не собирается прыгать и поставлять построенный по умолчанию SqlConnection за спиной или что-то безумное) –

0

Немного поздно, но ....

Нашел на following блоге.

Просто добавьте:

Упорство Security Info = True

... в строке подключения. Работал для меня.

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

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