IoCのUnity実現

29841 ワード

public static class Bootstrapper

    {

        private static ILog logger = LogManager.GetLogger(typeof(Bootstrapper));



        static Bootstrapper()

        {

            try

            {

                logger.Info("start load container");

                Container.InitializeWith(new DependencyResolverFactory());

            }

            catch (Exception ex)

            {

                logger.Fatal(ex);

            }

        }

        public static void Run()

        {

            logger.Info("start run bootstrapper task...");

            Container.ResolveAll<IBackgroundTask>().ForEach(action =>

            {

                action.Start();

            });

        }

    }
public interface IDependencyResolverFactory

    {

        IDependencyResolver CreateInstance();

    }



public interface IDependencyResolver : IDisposable

    {

        void Register<T>(T instance);

        void Inject<T>(T existing);

        T Resolve<T>(Type type);

        T Resolve<T>(Type type, string name);

        T Resolve<T>();

        T Resolve<T>(string name);

        IEnumerable<T> ResolveAll<T>();

    }
public class DependencyResolverFactory : IDependencyResolverFactory

    {

        private static ILog logger = LogManager.GetLogger(typeof(DependencyResolverFactory));

        private static Dictionary<string, IDependencyResolver> dictDependency = new Dictionary<string, IDependencyResolver>();



        private readonly Type _resolverType;        



        public DependencyResolverFactory(string resolverTypeName)

        {

            _resolverType = Type.GetType(resolverTypeName, true, true);

        }



        public DependencyResolverFactory()

            : this(ConfigurationManager.AppSettings["dependencyResolverTypeName"])

        {

        }



        public IDependencyResolver CreateInstance()

        {

            try

            {

                if (dictDependency.ContainsKey(_resolverType.FullName))

                {

                    return dictDependency[_resolverType.FullName];

                }

                var instance = Activator.CreateInstance(_resolverType, new object[] {"" }) as IDependencyResolver;

                dictDependency.Add(_resolverType.FullName, instance);

                return instance;

            }

            catch (Exception exception)

            {

                logger.Error(exception);

            }

            return null;

        }

    }
public class UnityDependencyResolver : DisposableResource,IDependencyResolver

    {

        private readonly IUnityContainer container;



        private static object syncObject = new object();

        private static Dictionary<string, IUnityContainer> containers = new Dictionary<string, IUnityContainer>();



        public UnityDependencyResolver(IUnityContainer container)

        {

            this.container = container;

        }

        public UnityDependencyResolver(string containerName = ""):this(new UnityContainer().AddNewExtension<Interception>())

        {

            if (containers.ContainsKey(containerName))

            {

                this.container = containers[containerName];

            }

            else

            {

                lock (syncObject)

                {

                    UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");

                    if (section == null)

                    {

                        throw new ConfigurationErrorsException("The Unity configuration section does not exist");

                    }

                    IUnityContainer con = new UnityContainer();

                    if (string.IsNullOrEmpty(containerName))

                    {

                        section.Configure(con);

                    }

                    else

                    {

                        section.Configure(con, containerName);

                    }



                    containers.Add(containerName, con);

                    this.container = containers[containerName];

                }

            }

        }



        public void Register<T>(T instance)

        {

            container.RegisterInstance(instance);

        }



        public void Inject<T>(T instance)

        {

            container.BuildUp(instance);

        }



        public T Resolve<T>(Type type)

        {

            return (T)container.Resolve(type);

        }



        public T Resolve<T>(Type type, string name)

        {

            return (T)container.Resolve(type, name);

        }



        public T Resolve<T>()

        {

            return container.Resolve<T>();

        }



        public T Resolve<T>(string name)

        {

            return container.Resolve<T>(name);

        }



        public IEnumerable<T> ResolveAll<T>()

        {

            return container.ResolveAll<T>();

        }



        protected override void Dispose(bool disposing)

        {

            if (disposing)

            {

                container.Dispose();

            }

            base.Dispose(disposing);

        }

    }
<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <configSections>

    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />

  </configSections>



  <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">

    <sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Microsoft.Practices.Unity.Interception.Configuration" />



    <!-- BackgroundTask -->

    <alias alias="IBackgroundTask" type="UnitySample.Core.Infrastructure.IBackgroundTask,UnitySample.Core"/>

    <alias alias="UserSettingBackgroundTask" type="UnitySample.Core.Infrastructure.UserSettingBackgroundTask,UnitySample.Core"/>



    <!-- Dao-->

    <alias alias="CacheDataDao" type="UnitySample.Core.Dao.CacheDataDao,UnitySample.Core"/>

    <alias alias="FunctionCatalogDao" type="UnitySample.Core.Dao.FunctionCatalogDao,UnitySample.Core"/>

    <alias alias="FunctionDao" type="UnitySample.Core.Dao.FunctionDao,UnitySample.Core"/>

    <alias alias="ConfigSettingDao" type="UnitySample.Core.Dao.ConfigSettingDao,UnitySample.Core"/>



    <!-- Cache -->

    <alias alias="ICache" type="UnitySample.Core.Infrastructure.Caching.ICache,UnitySample.Core"/>

    <alias alias="CacheImpl" type="UnitySample.Core.Infrastructure.Caching.CacheImpl,UnitySample.Core"/>



    <!-- db helper-->

    <alias alias="SQLiteHelper" type="UnitySample.Core.DataAccess.SQLiteHelper,UnitySample.Core" />



    <!-- config -->

    <alias alias="IConfigurationSettings" type="UnitySample.Core.Configuration.IConfigurationSettings,UnitySample.Core"/>

    <alias alias="ConfigurationSettings" type="UnitySample.Core.Configuration.ConfigurationSettings,UnitySample.Core"/>



    <alias alias="IEventAggregator" type="UnitySample.Core.Infrastructure.IEventAggregator,UnitySample.Core"/>

    <alias alias="EventAggregator" type="UnitySample.Core.Infrastructure.EventAggregator,UnitySample.Core"/>



    <container>

      <extension type="Interception" />



      <!-- BackgroundTask-->

      <register type="IBackgroundTask" mapTo="UserSettingBackgroundTask" name="UserSettingTask">

        <lifetime type="singleton"/>

        <constructor>

          <param name="eventAggregator" dependencyType="IEventAggregator" />

          <param name="configDao" dependencyType="ConfigSettingDao" />

        </constructor>

      </register>



      <!-- Cache -->

      <register type="ICache" mapTo="CacheImpl" name="MemoryCache">

        <lifetime type="singleton"/>

        <constructor>

          <param name="cacheManagerName" value="MemoryCache" />

        </constructor>

      </register>

      <register type="ICache" mapTo="CacheImpl" name="FileCache">

        <lifetime type="singleton"/>

        <constructor>

          <param name="cacheManagerName" value="FileCache" />

        </constructor>

      </register>

      <register type="ICache" mapTo="CacheImpl" name="CFPCache">

        <lifetime type="singleton"/>

        <constructor>

          <param name="cacheManagerName" value="CFPCache" />

        </constructor>

      </register>

      <register type="ICache" mapTo="CacheImpl" name="CFHCache">

        <lifetime type="singleton"/>

        <constructor>

          <param name="cacheManagerName" value="CFHCache" />

        </constructor>

      </register>

      <register type="ICache" mapTo="CacheImpl" name="CFSCache">

        <lifetime type="singleton"/>

        <constructor>

          <param name="cacheManagerName" value="CFSCache" />

        </constructor>

      </register>



      <!-- Dao -->

      <register type="CacheDataDao">

        <lifetime type="singleton"/>

        <constructor>

          <param name="db" dependencyType="SQLiteHelper" />

        </constructor>

      </register>



      <register type="FunctionCatalogDao">

        <lifetime type="singleton"/>

        <constructor>

          <param name="db" dependencyType="SQLiteHelper" />

        </constructor>

      </register>



      <register type="FunctionDao">

        <lifetime type="singleton"/>

        <constructor>

          <param name="db" dependencyType="SQLiteHelper" />

        </constructor>

      </register>



      <register type="ConfigSettingDao">

        <lifetime type="singleton"/>

        <constructor>

          <param name="db" dependencyType="SQLiteHelper" />

        </constructor>

      </register>

      <!-- DBHelper -->

      <register type="SQLiteHelper">

        <lifetime type="singleton" />

      </register>



      <!--config-->

      <register type="IConfigurationSettings" mapTo="ConfigurationSettings">

        <lifetime type="singleton"/>

        <constructor>

          <param name="configDao" dependencyType="ConfigSettingDao" />

          <param name="eventAggregator" dependencyType="IEventAggregator" />

        </constructor>

      </register>



      <register type="IEventAggregator" mapTo="EventAggregator">

        <lifetime type="singleton"/>

      </register>



    </container>

  </unity>

</configuration>

 
開始:
Bootstrapper.Run();
Unityではなく、他のIoCフレームワークを採用する場合は、IDependencyResolverを実現するとともにAppする.configでdependencyResolverTypeを指し示せばよい.