2011-01-20 28 views
3

我不知道如何用一种好的方式来描述这个,但是这里有。统一和终生管理

我有4个班级:A,B,C,D。

A与B,C,d
注入C被注入d

A是每决心。
B是单身人士。
C和D我不知道。

我想A和C使用d的同一实例,因此每次我解决从容器时,应d一次创建并注入A和C.

最简单的方法是使A不需要使用Unity就可以将D传递给C。但有没有办法与Unity做到这一点?我只使用ContainerControlledLifetimeManager和PerResolveLifetimeManager,并没有使用子容器,我怀疑这可能会有用。我一直在玩这个,但结果很麻烦。它可以轻松完成吗?

回答

10

是否有更大的上下文,您正在使用?在ASP.NET中,我创建了一个PerRequestLifetimeManager,它在单个HTTP请求期间多次请求时返回相同的对象。

编辑:如果你有兴趣,这是一个实现。

public class PerRequestLifetimeManager : LifetimeManager 
{ 
    private readonly object key = new object(); 

    public override object GetValue() 
    { 
     if (HttpContext.Current != null && HttpContext.Current.Items.Contains(key)) 
      return HttpContext.Current.Items[key]; 
     else 
      return null; 
    } 

    public override void RemoveValue() 
    { 
     if (HttpContext.Current != null) 
      HttpContext.Current.Items.Remove(key); 
    } 

    public override void SetValue(object newValue) 
    { 
     if (HttpContext.Current != null) 
      HttpContext.Current.Items[key] = newValue; 
    } 
+0

没有像一个HTTP Session一个明显的例子,但我想我可以做一个。但是呢?我应该为PerRequestLifetimeManager分配哪些对象?如果我只将它分配给D,这似乎是显而易见的,但由于它是单身人士,B不会得到新的。我应该也改变B吗?在许多依赖关系很大的应用程序中,手动确定哪些类型应该是PerRequestLifetimeManager很难。请告诉我们更多关于它是如何工作的,这似乎是一个好主意,但我完全不理解它。 – Karsten 2011-01-21 08:08:00

+0

我在想D会解决一个请求。你的场景并不表示B持有对D的引用。如果确实如此,那么B将只有一个D实例使你的场景无法解决(除非D也是单身)。您的情况可能过于复杂,无法在摘要中解决。如果您为A,B,C和D指定了一些基本功能,那么也许我可以摆脱一些更好的光线。 – 2011-01-21 18:57:24

0

所以,要在&℃之间共享d当A得到解决。什么时候别的东西解决了?

如果它只是“无处不在的一个实例”,那就是ContainerControlledLifetimeManager。

如果您只想在此特定实例中共享D,则可以使用名称和PerResolve或ContainerControlled注册D,具体取决于所需的语义。然后,在配置A & C时,使用该特定名称注入D.

如果是别的东西,我需要更多的细节。

你可能不需要进入这个子容器。