2

我想使用NinjectDbConnection映射到未打開的SqlConnection。這是我做了什麼:Ninject:請求DbConnection時提供未打開的SqlConnection

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

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

然而,試圖用分貝時,我得到一個錯誤,指出

此操作需要在「主」數據庫的連接。無法創建與「主」數據庫的連接,因爲原始數據庫連接已打開且憑據已從連接字符串中刪除。提供未打開的連接。

(同樣的操作工作,如果我只是提供new SqlConnection(constr)連接...)

原來SqlConnection我被Ninject給出的QueryString屬性爲空。我究竟做錯了什麼?


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 pro perty是空的。

+0

你不是說'**查詢**字符串'你呢? – 2010-02-01 14:22:42

+0

這是您唯一的'Bind'調用嗎?看不到'Get ()'如果不能通過arg [並選擇ctor的非默認超載]。 – 2010-02-01 14:26:01

+0

你確定'constr'是在你綁定的時候初始化的嗎? – 2010-02-01 16:54:28

回答

0

我最終通過創建自定義提供程序來解決此問題,並對其進行綁定。 (我也升級到了2.0 Ninject,這可能會影響到結果...)

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

你的代碼看起來很好,如果你要求DBConnection,Ninject應該大聲使用綁定或comnplain。

你確定ImplicitSelfBinding未進入嗎?你能把它關掉嗎Module? (但是你需要注入一個SqlConnection才能實現)。

如果您在Bind行後立即執行Get<DBConnection>(),會發生什麼情況?

+0

我已經更新了我的問題和結果。我如何控制ImplicitSelfBinding? (但不,我正在注入'DbConnection' ...) – 2010-02-01 14:12:27

+0

ImplicitSelfBindingDefault被傳入模塊(或者是內核還是兩者?)構造。您可以通過查看模塊的ImplicitSelfBinding屬性來查看狀態。它只意味着類X被綁定到X.(也就是說,它可能與你的情況無關 - 如果它已經打開並且你沒有綁定,那麼Ninject會允許你獲得一個SqlConnection,並且它將被默認構造。你肯定會解決一個DBConnection,它不會跳進去,並提供一個默認構造的SqlConnection在你的背後或任何瘋狂的) – 2010-02-01 14:20:27

0

有點晚了,但是....

發現這對following博客。

只需添加:

堅持安全信息=真

...你的連接字符串。爲我工作。

相關問題