Должен ли я заставить объект IUnityContainer использовать шаблон Singleton? - PullRequest
1 голос
/ 17 февраля 2009

Я новичок в использовании концепций Unity и IoC / DI. Я начал с этой концепции, прокрутив свое собственное шоу Джеймса Ковача на dnrTV в тесте.

В его примере контейнер выполнялся как одноэлементный доступ через статический метод в классе 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 Ответ

1 голос
/ 25 февраля 2009

Я использую статический класс по той же причине - чтобы он не выходил за рамки.

Единственное отличие, которое я делаю для вас, заключается в том, что я обертываю все вызовы Unity и добавляю проверки, чтобы убедиться, что 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;        
        }
    }
}
...