我不太确定DryIoc值得我花时间。它看起来像轻量级,并且在跨平台环境中得到很好的支持(使用Xamarin)。但我觉得使用它有点困难(在我自己探索一切方面)。
DryIoc社区也不是很大(通过阅读关于DryIoc的一些答案,我认识到看起来只有作者跳进来并给出答案)。这是我在标题中提到的问题。假设我有2个ViewModel类,第二个有一个属性应始终与第一个属性匹配(映射),如下所示:
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 BUT的单例,我还需要从第一个属性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
。
我真的无法自己探索这个。注入一些注册类型的 是很好的(至少我知道怎么做),但这里注入的值是 某些属性的另一个属性注册类型 。
答案 0 :(得分: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
,然后将它们注入两者。