2017-07-20 114 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

相关问题