2009-08-07 8 views
2

インターフェイスを別のアセンブリの具象クラスにバインドするにはどうすればよいですか?構造マップでNinject Binding

Foo.Data
Foo.Domainは

私はStructureMap.configファイルに私の2人のアセンブリ名を追加してからPluginFamilyを使用して:

私は私の溶液中で、次のプロジェクトを持っていますプラグ可能な属性は私のインターフェースを私の具体的なクラスにマップします。 '

どのようにNinjectで同じことを達成できますか?

+0

ソリューション内のプロジェクトには、インターフェイスとコンクリートクラスの両方が含まれていますか?消費するソリューション/プロジェクト、またはこのソリューション自体の中でバインドすることを検討していますか? –

+0

また、どのバージョンのNinjectを使用していますか? –

+0

@Peterインターフェイスは私のドメインにあり、具体的なクラスはデータレイヤーにあります。私は解決策の中で束縛することを探しています。私はまた、同じプロジェクト内の別々のフォルダでそれを行うために、ドメインとデータレイヤーをプロジェクトごとにセパレートする代わりに検討しています。私はコンパクトなフレームワークのためにNinject 1.0を使用しています。 –

答えて

6

私はここでいくつかの仮定をします。

  1. Foo.DomainプロジェクトにIBarというインターフェースがあり、Foo.Dataプロジェクトに具体的なBarClassクラスがあります。
  2. BarClassがIBarを実装しているため、Foo.DataプロジェクトのFoo.Domainプロジェクトを参照しています。

    internal class BarModule : StandardModule { 
        public override void Load() { 
        Bind<IBar>() 
         .To<BarClass>(); 
        } 
    } 
    

    このクラスは、その後、具体的なクラスにIBARの要求のためのバインディングを確立します:

Ninjectを行うための最も簡単な事はNinjectのStandardModuleから派生Foo.Dataで新しいクラスを作成することですBarClassのこれはあなたのXMLに相当します。

次のステップは、Ninjectカーネル(別名「コンテナ」)を作成し、このモジュール(つまりこの構成)を提供することです。これを行う場所は、作成しているアプリケーションの種類によって大きく異なります。非常に一般的には、通常、コードの論理的なエントリポイントまたは "起動"セクションでカーネルを設定します。コンソールやWindowsのデスクトップアプリケーションの場合、これはmain()関数が最初に行うことの1つになりそうです。

var barObj = kernel.Get<IBar>() 

barObjがBarClassのインスタンスを参照する変数:あなたはこのような何かをするとき、この時点で

var modules = new IModule[] { 
           new BarModule() 
          }; 

var kernel = new StandardKernel(modules); 

コードは、これをしたいと思います。

私はあなたのアプリケーションのすべてのニュアンスを完全に理解することはできませんでした。アセンブリは動的に読み込まれます。これは何らかの助けになると思います。

+0

パーティーに少し遅れましたが、これは非常にしっかりした回答です、Peterに感謝します。 –