zoukankan      html  css  js  c++  java
  • 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>
    

      

  • 相关阅读:
    findIndex() 方法用法
    Centos7安装nginx1.17.5,集成upstream和stream
    Centos7安装docker
    LeetCode(C++)刷题计划:17-电话号码的字母组合
    LeetCode(C++)刷题计划:16-最接近的三数之和
    LeetCode(C++)刷题计划:15-三数之和
    LeetCode(C++)刷题计划:14-最长公共前缀
    LeetCode(C++)刷题计划:13-罗马数字转整数
    LeetCode(C++)刷题计划:12-整数转罗马数字
    LeetCode(C++)刷题计划:11-盛最多水的容器
  • 原文地址:https://www.cnblogs.com/sylone/p/9483250.html
Copyright © 2011-2022 走看看