2012-09-03 15 views
8

私はプロジェクトでIinCコンテナとしてNinjectを使用しています。私は次のクラスを持っています:コンストラクタ文字列引数のNinjectへのバインドに基づくバインド

public class SomeRepository:ISomeRepository 
{ 
    public SomeRepository(string someDatabaseConnectionString) 
    { 
     // some code here.. 
    } 
} 

私のアプリケーション設定ファイルには、「someDatabase」という名前の接続文字列があります。デフォルトでは1は、コンストラクタには、この接続文字列を注入するために、以下の設定を追加する必要があります

kernel.Bind<ISomeRepository>() 
    .To<SomeRepository>() 
    .WithConstructorArgument("someDatabaseConnectionString", connString); 

しかし、私は、従来のような文字列の結合ベースを実装したいです。名前が "ConnectionString"で終わる文字列型のすべてのコンストラクタパラメータの値は、アプリケーションのconnectionStrings構成セクションから取得し、自動的に挿入する必要があります。 appSettingsセクションにも同様の規約を実装したいと思います。このアプローチは、Mark Seemanの"Primitive Dependencies"の記事(「プリミティブの規則」セクション)で詳しく説明されています。例ではCastle Windsorコンテナを使用しました。

Ninjectを使用してこのような慣習を実装することは可能ですか?これを行う最も良い方法は何ですか?私はすでにninject.extensions.conventionsを試しましたが、そのような機能はないようですね。

+0

ConfigurationManager.AppSettings ["someDatabaseConnectionString"]を使用できますか? – Ben

+0

現在、私はConfigurationManager.AppSettings ["someDatabaseConnectionString"]を使用しています。しかし、接続文字列に依存するクラスが20以上あるとします。私はこれらのクラスのそれぞれについて特定のルールを書こうと思っていません、私は自動的に依存関係を注入したいです。 –

答えて

1

Ninjectでは、この種の従来のバインディングが現在可能ではないようです。 I had a similar question hereと提案は、接続文字列を返すためのインターフェイスを作成し、それをパラメータとして持つことでした。それは、しかし、多くの異なる接続文字列のために退屈なことができます。

これは単なる考えですが、IConnectionStringProvider<T> という名前で、Tの名前を取得してアプリケーションの設定をそのように見極めることができますか?多分このように:それが動作しない場合

public class ConnectionStringProvider<T> : IConnectionStringProvider<T> 
{ 
    public string Value 
    { 
     // use reflection to get name of T 
     // look up connection string based on the name 
     // return the connection string 
    } 
} 
... 
public class SomeRepository:ISomeRepository 
{ 
    public SomeRepository(IConnectionStringProvider<SomeRepository> connectionStringProvider) 
    { 
     this.connectionString = connectionStringProvider.Value; 
    } 
} 

また、あなたは引数として型を取る非ジェネリックIConnectionStringProviderを持つことができます:

public class ConnectionStringProvider : IConnectionStringProvider 
{ 
    public string GetValueFor(Type type) 
    { 
     // use reflection to get name of type 
     // look up connection string based on the name 
     // return the connection string 
    } 
} 
... 
public class SomeRepository:ISomeRepository 
{ 
    public SomeRepository(IConnectionStringProvider connectionStringProvider) 
    { 
     this.connectionString = connectionStringProvider.GetValueFor(this.GetType()); 
    } 
} 

その後、これらの作品の一つ、彼らは希望の場合どのDIコンテナでも動作するという利点があります。

関連する問題