2016-10-21 24 views
0

私はお互いに依存する2つのクラスを持っています。明らかに、私が次のようにしてninjectを使用するとき:プロパティ注入が機能しない

public Class Class1() 
{ 
    private readonly class2; 
    public Class1(IClass2 class2) 
    { 
    this.class2 = class2; 
    } 
} 

public Class Class2() 
{ 
    private readonly class1; 
    public Class1(IClass1 class1) 
    { 
    this.class1 = class1; 
    } 
} 

これは循環依存関係になります。

私はこの問題を解決する方法が特性注入であることを知っています。私はプロパティを持つ二番目にコンストラクタで最初に注入したときに、

public Class Class2() 
{ 
    private readonly class1; 
    public Class1(IClass1 class1) 
    { 
    this.class1 = class1; 
    } 
} 

、逆の方法:本との組み合わせで

public Class Class1() 
{ 
    private readonly class2; 
    public Class1() 
    { 
    } 
    [Inject] 
    IClass2 Class2 
    { 
    get { return this.class2; } 
    set { this.class2 = value; } 
    } 
} 

:しかし、私はこれを試してみました。どちらも循環的な依存関係になります。 3つ目は、両方でプロパティインジェクションを使用すると、StackOverflow例外が発生します。このタイプの注入を実行する方法は何ですか?両方ともサービスクラスであることに留意してください。

バインディング:

/// <summary> 
     /// Creates the kernel that will manage your application. 
     /// </summary> 
     /// <returns>The created kernel.</returns> 
     private static IKernel CreateKernel() 
     { 
      var kernel = new StandardKernel(); 
      try 
      { 
       kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
       kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 

       RegisterServices(kernel); 
       return kernel; 
      } 
      catch 
      { 
       kernel.Dispose(); 
       throw; 
      } 
     } 

     /// <summary> 
     /// Load your modules or register your services here! 
     /// </summary> 
     /// <param name="kernel">The kernel.</param> 
     private static void RegisterServices(IKernel kernel) 
     { 
      kernel.Bind(b => b 
      .From(Assemblies.ProjectServices) // link to the services there 
      .SelectAllClasses() 
      .BindDefaultInterface()); 
     } 
+0

プロパティの注入は循環依存性を解決するはずですが、どこに例外がスローされるのかわかりますか? – YuvShap

+0

私はClass1を注入するコントローラを持っています(それに依存します)。初期化しようとすると例外がスローされます。 – StefanL19

+0

ninjectカーネルバインディングを表示できますか? – YuvShap

答えて

1

を私はあなたがクラス1とクラス2の代わりに、deafult 1(InTransientScope())を登録する際、他のObject Scopesを使用しようとすることができたと思います。また、私はあなたが両方のクラスのプロパティインジェクションを使用するだけでなく、それらの一つでは、あなたがすべき場合にのみ動作することを考えて

kernel.Bind<IClass1>().To<Class1>().InSingletonScope(); 
kernel.Bind<IClass2>().To<Class2>().InSingletonScope(); 

:このような

何かが(私はここで例えばシングルトンスコープを使用しました)両方のオプションを試してください。

私はサイクリック依存関係はデザインに何か不足しているという大きなヒントであり、これらのクラスを再設計する必要があると思います。

+0

シングルトンスコープを使用しようとしましたか?実際のプログラムがシングルトンインスタンスでは動作しませんが、ユニークなオブジェクトが必要な場合はどうすればいいですか? –

+0

このように動作します。ありがとうございました! – StefanL19

+0

@MrinalKamboj私は問題が何であるかを理解していません。既に存在しているスコープから自分のニーズに答えるスコープを選択することができます。また、独自のスコープを作成できない場合は、シングルトンスコープは単なる例です。 – YuvShap

関連する問題