2017-07-20 162 views
0

我不太確定DryIoc是否值得我度過。它看起來像輕量級,並且在跨平臺環境中(Xamarin)很好地支持。但我感覺有點困難(就我自己而言)。 DryIoc社區也不是很大(通過閱讀關於DryIoc的一些答案,我認識到,看起來只有作者跳入並給出答案=))。這是我在標題中提到的問題。假設我有2視圖模型類,第二與第一的屬性,它應該始終與(映射)的屬性,像這樣:從另一註冊對象的另一個屬性注入屬性值?

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

現在我可以用dryioc爲雙方的ViewModels但對於登記單第二個,我也需要從第一個屬性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>()))); 

因此,您可以看到第一次註冊應該沒問題,因爲不需要屬性依賴關係。但第二個應該有A屬性取決於第一個A

真的,我不能自己探索這個。注射性能有一定的註冊類型的是好的(至少我知道如何做到這一點),但這裏的注入值一些註冊類型他人財產。

我希望作者(像往常一樣)會跳進來幫助我。非常感謝。

回答

1

這裏是straightforward way(但可能不是最好的),以實現:

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; } 
    } 
} 

在我看來,更好,更簡單的方式將控制的反轉:創建A外兩個虛擬機,然後將它們注入到兩者中。

+0

非常感謝。爲了您的更好的建議,您認爲它適合於隨時可以在運行時更改的動態內容('A')嗎?這是否意味着我們需要在每次更改時都注入它?無論如何,這聽起來對我來說真的是一個更好的解決方案,我對整體IoC並不是很熟悉,所以我認爲最初設置的一切都是***,而不是在某個過程中,所以也許這就是爲什麼我一開始沒有想到你建議的解決方案。 – Hopeless

+0

簡單,如果它是一個動態屬性,只需將它傳遞給一個正常的方法。不要注射。 – dadhi

+0

我認爲這是在這種情況下映射屬性的情況(所以它是自動的)。手動進行(設置)需要您記住每次創建VM時進行設置。實際上,如果你在樹中組織虛擬機,這可能很容易(因此一個屬性可以輕鬆地在同一棵樹中引用另一個屬性,或者即使我不需要在這樣的樹中引用同一對象的不同集線器,只需一個就足夠了。但是我真的覺得構建這樣一棵樹並不是鬆散耦合,測試虛擬機可能會更困難。 – Hopeless

相關問題