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

同じ理由で静的クラスを使用します-スコープ外に出ないようにするためです。

唯一の違いは、すべての 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;        
        }
    }
}
于 2009-02-25T07:44:50.680 に答える