2017-07-20 10 views
0

私はDryIocが私の時間の価値があるとは確信していません。軽量で、クロスプラットフォーム環境(Xamarin)でうまくサポートされています。しかし、私はそれを使って作業するのが少し難しいと感じています。 DryIocコミュニティもそれほど大きくはありません(そして、DryIocについてのいくつかの解答を読んで、私はそこに飛び込んで答えを出すだけのように見えます))。ここにタイトルで言及されたように私の問題があります。別の登録オブジェクトの別のプロパティから値を持つプロパティを挿入しますか?

public class ParentViewModel { 
} 
public class FirstViewModel { 
    public FirstViewModel(ParentViewModel parent){ 
    } 
    public string A { 
     //... 
    } 
} 
public class SecondViewModel { 
    public SecondViewModel(ParentViewModel parent){ 
    } 
    public string A { 
     //... 
    } 
} 

今、私は両方のviewmodelsためではなくのためにシングルトンを登録するdryiocを使用することができます。私は2のViewModelクラスがあるとし、第二は、常にこのように、最初のプロパティで(マッピングされる)と一致する必要があるプロパティを持っていますもう1つ、私はまた、最初のプロパティーAからの値でプロパティーAを注入する必要があります。

container.Register<ParentViewModel>(); 
container.Register<FirstViewModel>(reuse: Reuse.Singleton, made: Made.Of(() => new FirstViewModel(Arg.Of<ParentViewModel>()))); 
container.Register<SecondViewModel>(reuse: Reuse.Singleton, made: Made.Of(() => new SecondViewModel(Arg.Of<ParentViewModel>()))); 

したがって、プロパティの依存関係が必要ないため、最初の登録は正常であるはずです。しかし、2番目のものはAプロパティが最初のもののAに依存する必要があります。

本当に私は自分自身を探求することはできません。いくつかの登録タイプが細かい(と少なくとも私はそれを行う方法を知っている)の性質を注入するが、ここで注入された値は、いくつかの登録タイプ別のプロパティです。

著者(いつものように)がここにジャンプして私を助けてくれることを願っています。どうもありがとうございます。ここで

答えて

1

は、その達成するためにstraightforward wayである(ただし、最高のものではないかもしれない):両方のA外の作成:私の意見では

using System; 
using DryIoc; 

public class Program 
{ 
    public static void Main() 
    { 
     var container = new Container(); 

     container.Register<ParentViewModel>(); 

     container.Register<FirstViewModel>(Reuse.Singleton); 

     container.Register<SecondViewModel>(Reuse.Singleton, 
      made: PropertiesAndFields.Of.Name("A", r => r.Container.Resolve<FirstViewModel>().A)); 

     var firstVM = container.Resolve<FirstViewModel>(); 
     firstVM.A = "blah"; 

     var secondVM = container.Resolve<SecondViewModel>(); 

     Console.WriteLine(secondVM.A); // should output "blah" 
    } 

    public class ParentViewModel { 
    } 

    public class FirstViewModel { 
     public FirstViewModel(ParentViewModel parent) { } 
     public string A { get; set; } 
    } 

    public class SecondViewModel { 
     public SecondViewModel(ParentViewModel parent) {} 
     public string A { get; set; } 
    } 
} 

を、より良く、より簡単な方法は、制御の反転意志両方にVMを注入します。

+0

ありがとうございました。最終的には、より良い提案をするために、いつでも実行時に変更できる動的コンテンツ( 'A')に適していると思いますか?それは、変化するたびにそれを注入する必要があるということですか?とにかく私にとって本当に良い解決策と言えますが、私は一般的にIoCにはあまりよく慣れていないので、最初は***をすべて設定していますが、プロセスの途中ではありません。あなたが最初に提案した解決策は考えていませんでした。 – Hopeless

+0

単純ですが、動的プロパティの場合は、それを通常のメソッドに渡します。注射しないでください。 – dadhi

+0

私はそれが(このようにautoのように)この場合にはマッピングプロパティのシナリオだと思います。手動で設定する場合は、VMを作成するたびに設定することを忘れないでください。実際には、ツリー内にVMを編成すると簡単になります(同じツリーの別のプロパティを簡単に参照できるようにするか、ツリー内の同じオブジェクトを参照する別のハブを必要としません。しかし、本当に私はそのようなツリーを構築することは疎結合ではなく、VMをテストするのが難しいかもしれないと感じています。 – Hopeless

関連する問題