2017-02-06 7 views
-1

私はNinjectインターフェイス上ファクトリを作成するように指示:Ninject .ToFactory:例外:「例外がスロー: 『Ninject.ActivationException』をNinject.dllに」

this.Bind<IModelFactory>().ToFactory().InSingletonScope(); 

このファクトリインタフェースで、私は工場を定義します:

interface IModelFactory 
{ 
    MyClass CreateMyClassFactory(string param1, DateTime param2); 
} 

私は、新しいクラスを作成するために工場を使用しようとする:

Class myClass = modelFactory.CreateMyClassFactory(param1, new DateTime(2017,01,01); 

を...しかし、それは投げますSこの例外:スロー

例外:「Ninject.ActivationException」Ninject.dllに

追加情報:エラー活性化文字列

一致するバインディングが用意されていない、とタイプが自己バインド可能ではありません。

アクティベーションパス:依存列の

2)インジェクションタイプのMyClass

1のコンストラクタのパラメータのタイトルに)HedgeOrderMyClass

提案依頼:

1)あなたが持っていることを確認してくださいstringのバインディングを定義しました。

2)バインディングがモジュールで定義されている場合は、モジュールがカーネルにロードされていることを確認してください。

3)誤って複数のカーネルを作成していないことを確認してください。

4)コンストラクタ引数を使用する場合は、パラメータ名がコンストラクタのパラメータ名と一致することを確認してください。

5)自動モジュールロードを使用している場合は、検索パスとフィルタが正しいことを確認してください。

+0

[ここ](https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=100)で詳細に説明されているように、工場の抽象化を最初から防ぎます。 – Steven

答えて

0

インターフェイスにファクトリを作成するようにNinjectに指示すると、クラスの新しいコピーをコンテナから取り出し、実行時に欠落しているパラメータを記入するように要求しています。

これは私たちが望むクラスです:

public class MyClass 
{ 

} 

限りタイプstringDateTimeのパラメータを受け入れる少なくとも1つのコンストラクタがあるとして、それは動作します:

public class MyClass 
{ 
    // If this constructor is missing, then it throws an exception! 
    MyClass(string param1, DateTime param2, ISomeOtherInterface someOtherInterface) 
    { 
    } 
} 

Ninject ISomeOtherInterfaceを解決する方法を知っているので、問題はありません(別の場所でBind<>.To<>を使用したとします)。しかし、どうすればstring param1DateTime param2を解決できますか?

ファクトリメソッドは、ファンクションからそれらのパラメータをファクトリコールの引数に埋め込み、すべてうまく動作します。

デバッガを使用して実行すると、上記のコンストラクタがファクトリ作成コールで指定されたものと同じパラメータで呼び出されます。

これは本当に強力なアイデアです。独自の工場を作成するために、すべてのグルーコードを手動で書き込む必要はありません。

+0

あなたの 'MyClass'コンストラクタは、実行時の値とコンパイル時の依存関係を混在させます。これはアンチパターンです(https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=99)。 – Steven

+0

@Steven場合によっては、カスタムパラメータを使用して、実行時にDependency Injectionコンテナから新しいクラスを取り出す必要があります。工場パターンはこれを可能にします。 C#の専門家として4年間働いていると、最終的に工場のパターンに頼らずに解決できない問題が発生します。それは、想像力のどんなストレッチでも反パターンではなく、公式のGOF工場パターンです。 – Contango

+0

こちらの記事をお読みください。 – Steven

関連する問題