我应该使用IUnityContainer对象使用Singleton模式吗?

时间:2009-02-17 16:36:17

标签: inversion-of-control singleton unity-container

我是使用Unity和IoC / DI概念的新手。我开始使用这个概念,在dnrTV 的测试中通过James Kovacs的节目滚动自己。

他的示例将Container运行作为通过IoC类中的静态方法访问的单例,因此您可以在启动时注册类型并在整个应用程序中解析类型。

我知道这不是全功能,而是主要展示IoC的概念。

我现在正尝试在项目中使用Unity。

在我的Main()中,我创建了一个新容器,但是一旦我的WinForms打开,容器就会超出范围而被处理掉。稍后在程序中,当我尝试解析类型时,我不再拥有原始容器及其注册类型。

我缺少一个概念或实现构造吗?

我目前的想法是创造这样的东西:

public static class Container
{
    private static readonly object syncRoot = new object();
    private static volatile IUnityContainer instance;

    public static IUnityContainer Instance
    {
        get
        {
            if (instance == null)
            {
                lock (syncRoot)
                {
                    if (instance == null)
                    {
                        instance = new UnityContainer();
                    }
                }
            }
            return instance;
        }
    }
}

我很确定这会起作用,它似乎不对。

1 个答案:

答案 0 :(得分:1)

我出于同样的原因使用静态类 - 以避免它超出范围。

我与你的不同之处在于我将所有统一调用包装起来并添加检查以查看是否已经配置了unity,正如您将在此处看到的那样:

using System.Configuration;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;

namespace Utilities
{
    public static class ServiceLocator
    {
        private static IUnityContainer container = new UnityContainer();
        private static bool isConfigured;

        public static void Clear()
        {
            container = new UnityContainer();
        }

        private static IUnityContainer Container
        {
            get
            {
                if (!isConfigured)
                {
                    ConfigureContainer();
                }
                return container;
            }
        }

        public static T Resolve<T>()
        {
            return Container.Resolve<T>();
        }

        public static T Resolve<T>(string name)
        {
            return Container.Resolve<T>(name);
        }

        public static void AddInstance<T>(object instance)
        {
            Container.RegisterInstance(typeof (T), instance);
        }

        private static void ConfigureContainer()
        {
                UnityConfigurationSection section = (UnityConfigurationSection) ConfigurationManager.GetSection("unity");
                section.Containers.Default.Configure(container);
                isConfigured = true;        
        }
    }
}