团结和终身管理

时间:2011-01-20 13:24:39

标签: c# dependency-injection unity-container

我不知道如何以一种好的方式描述这一点,但是这里有。

我有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而且从不使用子容器,我怀疑这可能是有用的。我正在玩这个,但事实证明它非常混乱。可以轻松完成吗?

3 个答案:

答案 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.

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

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