Unity container 注册级联依赖项(取2)
我昨天试图问这个问题,但完全没有道理。所以我制作了一个复制品来证明我的问题 在下面的程序中,我正在解决酒吧女巫应该有一个Foo和一个傻瓜注射到它。傻瓜身上也注射了一个Foo。问题是我想让Bar和傻瓜都使用同一个Foo。在下面的代码中,这是不会发生的Unity container 注册级联依赖项(取2),unity-container,Unity Container,我昨天试图问这个问题,但完全没有道理。所以我制作了一个复制品来证明我的问题 在下面的程序中,我正在解决酒吧女巫应该有一个Foo和一个傻瓜注射到它。傻瓜身上也注射了一个Foo。问题是我想让Bar和傻瓜都使用同一个Foo。在下面的代码中,这是不会发生的 class Program { static void Main(string[] args) { IUnityContainer container = new UnityContainer();
class Program
{
static void Main(string[] args)
{
IUnityContainer container = new UnityContainer();
Console.WriteLine("Resolving Bar");
container.Resolve<Bar>();
Console.ReadLine();
}
}
public class Foo
{
public Foo()
{
Console.WriteLine("Foo created " + this.GetHashCode());
}
}
public class Fool
{
public Foo Foo { get; set; }
public Fool(Foo foo)
{
Foo = foo;
Console.WriteLine("Fool created with injected Foo " + foo.GetHashCode());
}
}
public class Bar
{
public Bar(Foo foo, Fool fool)
{
Console.WriteLine("Bar created with injected Foo " + foo.GetHashCode());
Console.WriteLine("Bar created with injected Fool.Foo " + fool.Foo.GetHashCode());
// I want foo == fool.Foo
}
}
public class Blat
{
public Blat(Foo foo, Fool fool)
{
Console.WriteLine("Blat created with injected Foo " + foo.GetHashCode());
Console.WriteLine("Blat created with injected Fool.Foo " + fool.Foo.GetHashCode());
}
}
每个控件都需要创建一个使用不同上下文的ViewModel。在每个viewModel中,服务必须使用相同的上下文。所以我希望Unity创建上下文,a和b都使用相同的上下文
我可以做一些类似于你建议的事情。我可以在BaseViewModel的构造函数中为服务设置上下文属性,但我觉得这很奇怪。现在我只是在构造器中更新服务,但我更愿意使用Unity,这样它们就不会紧密耦合。我希望有一种更优雅的方式。你有没有想过这样的事情:
公共类栏
{
公共酒吧(傻瓜)
{
这个。傻瓜=傻瓜;
}
公共福福
{
获取{返回this.Fool.Foo;}
设置{this.Fool.Foo=value;}
}
公共傻瓜{get;set;}
}
其中,
Bar.Foo
只是Bar.Fool.Foo
的一个方便设置器/获取器?为什么要将同一实例注入两次?使用您的IUnityContainer
,使用PerResolveLifetimeManager
注册Foo
,即:
static void Main(string[] args)
{
IUnityContainer container = new UnityContainer();
container.RegisterType<Foo>(new PerResolveLifetimeManager());
Console.WriteLine("Resolving Bar");
container.Resolve<Bar>();
container.Resolve<Blat>();
Console.ReadLine();
}
static void Main(字符串[]args)
{
IUnityContainer容器=新的UnityContainer();
RegisterType(新的PerResolveLifetimeManager());
控制台写入线(“解析条”);
container.Resolve();
container.Resolve();
Console.ReadLine();
}
解析Bar
时,Foo
的相同实例将被注入Bar
和dool
然后,当您解析Blat
时,Foo
的新实例将被注入Blat
和dool
所以Bar.Foo==Bar.Fool.Foo
和Blat.Foo==Blat.Fool.Foo
但是Bar.Foo!=Blat.Foo
和Bar.dool.Foo!=布拉特.傻瓜.福
每次调用
container.Resolve
,该图只解析了Foo
的一个实例,这就是PerResolveLifetimeManager
所做的。请参阅我的编辑,以了解我为什么两次注入同一实例的原因
BaseViewModel(Context context, ServiceA a, ServiceB b)
static void Main(string[] args)
{
IUnityContainer container = new UnityContainer();
container.RegisterType<Foo>(new PerResolveLifetimeManager());
Console.WriteLine("Resolving Bar");
container.Resolve<Bar>();
container.Resolve<Blat>();
Console.ReadLine();
}