Ninject: Предоставить неоткрытое SqlConnection при запросе на DbConnection - PullRequest
2 голосов
/ 01 февраля 2010

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

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

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

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

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

(та же операция работает, если я просто предоставляю соединение с new SqlConnection(constr) ...)

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


UPDATE

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

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

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

ОБНОВЛЕНИЕ 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 пусто.

Ответы [ 3 ]

0 голосов
/ 05 апреля 2010

Я решил эту проблему, создав собственного провайдера и связавшись с ним. (Я также обновился до 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 голосов
/ 05 апреля 2011

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

Обнаружено в блоге .

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

Сохранять информацию о безопасности = True

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

0 голосов
/ 01 февраля 2010

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

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

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

...