Unity container 注册级联依赖项(取2)

Unity container 注册级联依赖项(取2),unity-container,Unity Container,我昨天试图问这个问题,但完全没有道理。所以我制作了一个复制品来证明我的问题 在下面的程序中,我正在解决酒吧女巫应该有一个Foo和一个傻瓜注射到它。傻瓜身上也注射了一个Foo。问题是我想让Bar和傻瓜都使用同一个Foo。在下面的代码中,这是不会发生的 class Program { static void Main(string[] args) { IUnityContainer container = new UnityContainer();

我昨天试图问这个问题,但完全没有道理。所以我制作了一个复制品来证明我的问题

在下面的程序中,我正在解决酒吧女巫应该有一个Foo和一个傻瓜注射到它。傻瓜身上也注射了一个Foo。问题是我想让Bar和傻瓜都使用同一个Foo。在下面的代码中,这是不会发生的

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