2011-07-21 19 views
17

私の無知を許してください。しかし、私はIOCとNinJectにとって非常に新しいです。私は簡単に理解できる解決策のために高低を探しましたが、今のところ彼らは私を逃しました。もつとも引数を持つNinjectバインディングコンストラクタ/ Entity Framework接続文字列

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はその後、アプリ/ 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でそれを行うことはできないと思います。しかし、今後の変更点については、この[blog post](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); 
    } 
} 

(例えばSomeService<T>からISomeService<T>を結合して、一度にすべての可能なタイプのために行われるべきであるバインディング)、ToConstructor(新しい表現が必要とされる)ので、WithConstructorArgument遺骨を使用することはできません最も簡単なアプローチです。例:

Bind(typeof(ISomeService<>)) 
    .To(typeof(SomeService<>)) 
    .WithConstructorArgument("someParam", "someValue"); 
関連する問題