2009-07-19 10 views
2

[OK]を依存関係忍者のは、ここで私はNinjectは私がカーネルからの要求てるタイプに基づいて、依存関係を構築する方法を変更したいあなたのための1 ...Ninject:依存チェーンに基づいハウツーセットアップバインディング

です。

私は次のコンストラクタを持つDbConnectionFactoryクラスを持っている:私のコードを必要としている

 this.Bind<IDbConnectionFactory>().To<DbConnectionFactory>(); 

特定のクラス:「デフォルト」は、結合、私はNinjectはパラメータなしのコンストラクタを使用するために

public DbConnectionFactory() 
     : this(MyDatabase.ConnectionString) 
    { 
    } 

    public DbConnectionFactory(string connectionString) 
     : this(DbProviderFactories.GetFactory("System.Data.SqlClient"), connectionString) 
    { 
    } 

connectionStringパラメータを提供するように指示します。

 this.Bind<IDbConnectionFactory>().To<DbConnectionFactory>().Only(
      When.Context.InstanceOf(typeof(IRepository))).WithArgument(
      "connectionString", MyOtherDatabase.ConnectionString); 

しかし、私は今までNinjectは、デフォルトコンストラクタを使用して取得:私はそうのような結合セットアップしようとしました。

私は明白な何かを紛失しているはずです!

答えて

3

ここにはレイヤーが多すぎるかのように聞こえます。なぜあなたはDatabaseGatewayが必要ですか?なぜあなたは直接接続を管理するためにADO.NETプロバイダファクトリを使用して接続を作成していませんか?または、リポジトリパターンでNHibernateのようなものを使用し、オブジェクトをマップするのにこれを使用する方が良いでしょうか?

状況に応じて、より長いコンストラクタを使用し、代わりにMyDatabase.ConnectionStringまたはMyOtherDatabase.ConnectionStringを交互に渡すのはどうですか? herehereを説明しているように、プロバイダを使用することができますが、私はそれを回避しようと絶対に必要でない限り:

  1. は、2つの新しい属性

    public class DefaultDatabaseAttribute : Attribute {} 
    public class OtherDatabaseAttribute : Attribute {} 
    
  2. コンストラクタで適切な属性を持つDatabaseGateway引数を飾るの定義

    public class OneRepository : IRepository 
    { 
        public OneRepository([DefaultDatabase]DatabaseGateway factory) 
        { 
        } 
    } 
    
    public class TwoRepository : IRepository 
    { 
        public TwoRepository([OtherDatabase]DatabaseGateway factory) 
        { 
        } 
    } 
    

    あなたのプロバイダは次のようになります。

    工場もDatabaseGatewayに返却する必要がある場合
    public class DatabaseGatewayProvider : SimpleProvider<DatabaseGateway> 
    { 
         protected override DatabaseGateway CreateInstance(Ninject.Core.Activation.IContext context) 
         { 
          IDbConnectionFactory factory; 
          if (context.Member.IsDefined(typeof(DefaultDatabaseAttribute), false)) 
          { 
           factory = context.Kernel.get<IDbConnectionFactory>(With.Parameters.ConstructorArgument("connectionString", MyDatabase.ConnectionString))); 
          } 
          else if (context.Member.IsDefined(typeof(OtherDatabaseAttribute), false)) 
          { 
           factory = context.Kernel.get<IDbConnectionFactory>(With.Parameters.ConstructorArgument("connectionString", MyOtherDatabase.ConnectionString))); 
          } 
    
          return new DatabaseGateway(factory); 
         } 
    } 
    

あなたは決定に追加の属性を追加するには、このモデルを展開することができます。

これは扱いにくいですが、関係するレイヤの数が多い場合には最善の方法です。

1

このarticleもお手伝いします。 Jeffが言ったように、あなたはWith.Parameters.ConstructorArgument()を使いたいでしょう。 ConstructorArgumentの連鎖を続けるか、ディクショナリを使用して、複数の引数を渡すことができます。お役に立てれば!

関連する問題