2011-07-21 74 views
17

請原諒我的無知,但我對IOC和NinJect非常陌生。爲了易於理解的解決方案,我搜索了高和低,但到目前爲止他們已經躲過了我。Ninject - 具有參數的綁定構造函數/實體框架連接字符串

到目前爲止,我有以下的和預期的所有作品:

public class MyDbContext : DbContext 
{ 
    public MyDbContext() : base("MyAppConfig") 
    { 
    } 
    ........ 
} 

但是:那麼

private class StandardModule : NinjectModule 
    { 
     public override void Load() 
     { 
     Bind<ILog>().To<NLogLogger>(); // Use NLog 
     Bind<IMyEntityFrameWorkRepository().To<MyEntityFrameWorkRepository>(); 
     } 
    } 

MyEntityFrameWorkRepository通過在app/web.config文件中聲明的連接字符串創建自己的EF的DbContext !我的目標是這樣的 - 我知道這句法是「胡說八道」(我認爲我可能要IOC MyDbConext太),但我希望「僞代碼」傳達我的心願:

private class StandardModule : NinjectModule 
{ 
    public override void Load() 
    { 
    Bind<ILog>().To<NLogLogger>(); // Use NLog 

    string mySqlConnectionString = MyApp.GetCommandLineArgument("sqlconn"); // "Data Source=..." 
    Bind<IMyEntityFrameWorkRepository().To<MyEntityFrameWorkRepository>(mySqlConnectionString); 
    } 
} 

................. 

public class MyDbContext : DbContext 
{ 
    public MyDbContext(string sqlConnectionString) : 
     base(sqlConnectionString) // will accept a standard SQL connection string 
    { 
    } 
    ........ 
} 

我真的很感謝來自IOC/NinJect專家的一些反饋,因爲我確信任何「模式」在其他情況下都非常有用。

回答

21

您可以使用.WithConstructorArgument()方法來指定構造函數參數。第一個參數應該是構造函數參數的名稱。 Ninject的

public class StandardModule : NinjectModule 
{ 
    public override void Load() 
    { 
     string connectionString = "..."; 
     Bind<IMyEntityFrameWorkRepository().To<MyEntityFrameWorkRepository>() 
      .WithConstructorArgument("sqlConnectionString", connectionString); 
    } 

}

+0

TY太多了! ..我在搜索過程中看到了這個構造,但由於某種原因,我總是(錯誤地)關注'connectionString'的「範圍」......但是您的簡潔例子清楚地表明它僅僅是綁定的_value_重要。 – JcMaltaDev

+0

有沒有辦法做到這一點,沒有魔術字符串,或者讓ninject知道哪個超載,但決定在哪裏獲取值? – Maslow

+1

@Maslow我不認爲你可以在Ninject 2.2中做到這一點(但不要聽我說)。但是,您應閱讀討論即將進行的更改的[博客文章](http://www.planetgeek.ch/2011/05/28/ninject-constructor-selection-preview/)。 – mrydengren

3

新版本允許綁定定義擺脫魔弦。是這樣的:

public class StandardModule : NinjectModule 
{ 
    public override void Load() 
    { 
     string connectionString = "..."; 
     Bind<IMyEntityFrameWorkRepository() 
      .ToConstructor(_ => new MyEntityFrameWorkRepository(connectionString); 
    } 
} 

對於涉及通用類型的綁定(例如結合ISomeService<T>SomeService<T>和綁定應爲所有可能類型的一次執行),ToConstructor不能使用(需要新的表達),所以WithConstructorArgument遺體最簡單的方法。例如:

Bind(typeof(ISomeService<>)) 
    .To(typeof(SomeService<>)) 
    .WithConstructorArgument("someParam", "someValue"); 
相關問題