我不知道如何以一种好的方式描述这一点,但是这里有。
我有4个班级:A,B,C,D。
A注入B,C,D
C注入D
A是每个决心 B是单身人士 C和D我不知道。
我希望A和C使用相同的D实例,所以每次从容器中解析A时,D应该创建一次并注入A和C.
最简单的方法是让A简单地将D传递给C而不使用Unity。但有没有办法用Unity做到这一点?我一直只使用ContainerControlledLifetimeManager和PerResolveLifetimeManager而且从不使用子容器,我怀疑这可能是有用的。我正在玩这个,但事实证明它非常混乱。可以轻松完成吗?
答案 0 :(得分:11)
您的营业环境是否更大?在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;
}
答案 1 :(得分:1)
如果您使用的是MVC3,可以查看Unity.Mvc3 http://unitymvc3.codeplex.com
网站上的描述说“允许将Microsoft的Unity IoC容器与ASP.NET MVC 3简单集成的库。该项目包括一个定制的DependencyResolver,它根据HTTP请求创建一个子容器,并在最后处置所有已注册的IDisposable实例请求。“
用法http://www.devtrends.co.uk/blog/integrating-the-unity.mvc3-1.1-nuget-package-from-scratch
答案 2 :(得分:0)
所以,你想在A& A之间分享D. C解析时的C.什么时候解决了什么呢?
如果它只是“无处不在的D的一个实例”,那就是ContainerControlledLifetimeManager。
如果您只想在此特定实例中共享D,则可以使用名称注册D,并根据所需的语义注册PerResolve或ContainerControlled。然后,在配置A& C,用该特定名称注入D.
如果是别的话,我需要更多细节。
你可能不需要进入这个子容器。