Unity

1、基本方式

为了接下来的说明,我们先编写几个后面需要的接口和类:

准备工作:ILogger 接口

    public interface ILogger
    {
        void Log(string msg);
    }

继承上述接口的子类

public class DBLogger : ILogger
    {
        public void Log(string msg)
        {
            Console.WriteLine("数据库记录消息为:" + msg);
        }
    }

public class FileLogger : ILogger
    {
        public void Log(string msg)
        {
            Console.WriteLine("日志文件记录消息为:" + msg);
        }
    }

Step1. 创建对象容器

在Unity中创建容器实例最简单的方法是直接使用构造函数创建,如下代码所示:

IUnityContainer container = new UnityContainer();

Step2. 注册接口映射

在Unity中提供了一组Register方法供我们在容器中注册接口映射,如下代码所示:

 container.RegisterType<ILogger, DBLogger>();

Step3. 获取对象实例

在Unity中提供了一组Resolve方法用以获取对象实例,如下代码所示:

var logger = container.Resolve<ILogger>();

OK,就这么简单!

测试如下:

class Program
    {
        static void Main(string[] args)
        {
            //
            IUnityContainer container = new UnityContainer();
            container.RegisterType<ILogger, DBLogger>();
            var logger = container.Resolve<ILogger>();
            logger.Log("孙行者:看我72变");
            //
            container.RegisterType<ILogger, FileLogger>();
            logger = container.Resolve<ILogger>();
            logger.Log("二郎神:看我73变");
            Console.ReadKey();
        }
    }

2、配置文件的方式

public class UnityIocHelper : IServiceProvider
    {
        private readonly IUnityContainer _container;
        private static readonly UnityIocHelper dbinstance = new UnityIocHelper("DBcontainer");
        private UnityIocHelper(string containerName)
        {
            UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
            _container = new UnityContainer();
            section.Configure(_container, containerName);
        }

        public static UnityIocHelper DBInstance
        {
            get { return dbinstance; }
        }
        public object GetService(Type serviceType)
        {
            return _container.Resolve(serviceType);
        }
        public T GetService<T>()
        {
            return _container.Resolve<T>();
        }
        public T GetService<T>(params ParameterOverride[] obj)
        {
            return _container.Resolve<T>(obj);
        }
        public T GetService<T>(string name, params ParameterOverride[] obj)
        {
            return _container.Resolve<T>(name, obj);
        }
    }

 具体调用方法

public static IDatabase Base(string connString)
        {
            return UnityIocHelper.DBInstance.GetService<IDatabase>(“MySql”, new ParameterOverride(
              "connString", connString));
        }

   配置信息

<unity>
  <typeAliases>
    <typeAlias alias="IDatabase" type="LRMC.Data.IDatabase,LRMC.Data" />
    <typeAlias alias="SqlServer" type="LRMC.Data.SqlDapper.Database,LRMC.Data.SqlDapper" />
    <typeAlias alias="MySql"     type="LRMC.Data.MySqlDapper.Database,LRMC.Data.MySqlDapper" />
  </typeAliases>
  <containers>
    <container name="DBcontainer">
      <!-- 默认数据库软件类型:SqlServer,MySql,Oracle,Access,SQLite-->
      <type type="IDatabase" mapTo="SqlServer" name="SqlServer"></type >
      <type type="IDatabase" mapTo="MySql" name="MySql"></type >
    </container>
  </containers>
</unity>

  typeAlias 指定一个类的别名,<type type="IDatabase" mapTo="MySql" name="MySql"></type >就是IDatabase这个接口通过MySql(LRMC.Data.MySqlDapper.Database)这个类去实现。

       另外在unity2.0配置中alias节点下的生命管理周期配置并不需要了,比如我们创建一个单例注册类型,只需要配置下面就可以了:

 

<containers>
    <container name="defaultContainer">
      <register type="UnityContainerDemo.IPeople, UnityContainerDemo" mapTo="UnityContainerDemo.VillagePeople01, UnityContainerDemo">
        <lifetime type="singleton" />
      </register>
      <register type="UnityContainerDemo.IWaterTool, UnityContainerDemo" mapTo="UnityContainerDemo.PressWater, UnityContainerDemo"/>
    </container>
  </containers>
  </unity>

 

  

 

posted @ 2018-08-15 18:38  在西天取经的路上……  阅读(276)  评论(0编辑  收藏  举报