1

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

他的示例将容器作为单例运行,通过 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;
        }
    }
}

我很确定这会奏效,只是看起来不对。

4

1 回答 1

1

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

我对您所做的一个区别是我包装了所有统一调用并添加检查以查看是否已配置统一,您将在此处看到:

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;        
        }
    }
}
于 2009-02-25T07:44:50.680 回答