zoukankan      html  css  js  c++  java
  • 微软依赖注入Unity

    Unity是一个依赖注入(Dependency Injection,DI)容器。DI的标准描述文章来自Martin Flower[0]。作为一个快速的摘要,依赖注入容器就是一个用于构建高度松耦合的软件的工具。依赖注入容器处理相互关 联对象的所有细节,因此你可以构建一个独立的组件

    关于依赖注入大家可以百度一下,这是百科的解释:http://baike.baidu.com/view/1800021.htm

    这是unity的地址:http://unity.codeplex.com/
    下载最新的是2.1版本,http://www.microsoft.com/download/en/details.aspx?id=17866
    下载是msi文件,安装后有bin文件夹和源代码和几个实例项目

    打开vs,新建项目,添加Microsoft.Practices.Unity.dll的引用,就可以使用依赖注入了

    1.准备接口和类
    public interface ILog
        {
            void Write(string message);
        }

        public class TextFileLogger : ILog
        {
            public void Write(string message)
            {
                Console.WriteLine("Text File Write" + message);
            }
        }

        public class DatabaseLogger : ILog
        {
            public void Write(string message)
            {
                Console.WriteLine("Database Write" + message);
            }
        }

    通过代码方式进行依赖注入
    2.在  static void Main(string[] args)方法中创建容器。
    容器可以注册接口和返回接口,是依赖注入的核心。

    **简单步骤,1创建容器,2注册接口映射,3获取实例

    //容器
                IUnityContainer parentContainer = new UnityContainer();
                //父容器可以创建子容器
                //IUnityContainer chileContainer = parentContainer.CreateChildContainer();
                //默认对象
                parentContainer.RegisterType <ILog, UnityDI.TextFileLogger>();
                //给datalogger在容器中起个名字,以后根据名字得到databaselogger
                parentContainer.RegisterType<ILog, UnityDI.DatabaseLogger>("database");

                //没有参数取默认
                ILog textLog = parentContainer.Resolve<ILog>();
                textLog.Write("aaaaaaaaaaa");
                //根据名字去
                ILog dataLog = parentContainer.Resolve<ILog>("database");
                dataLog.Write("aaaaaaaaaaa");

                //遍历输出已注册的ILogger接口对象,默认参数不会输出
                foreach (object mapping in parentContainer.ResolveAll<ILog>())
                {
                    Console.WriteLine(mapping.GetType());
                }

    根据配置文件方式进入依赖注入
    在config文件中的
    配置  <configSections>
        <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
      </configSections>
    (注意configSections这个节点必须configuration下的第一个节点)

    然后

      <unity>
        <typeAliases>
          <!--三个不同类型的生命周期-->
          <typeAlias alias="singleton"
                     type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager, Microsoft.Practices.Unity" />
          <typeAlias alias="external"
                     type="Microsoft.Practices.Unity.ExternallyControlledLifetimeManager, Microsoft.Practices.Unity" />
          <typeAlias alias="perThread"
                     type="Microsoft.Practices.Unity.PerThreadLifetimeManager, Microsoft.Practices.Unity" />
         
          <!--给类注册别名,以后直接使用别名就可以代替具体类,type=类的详细命名空间和类名词,然后逗号后面是程序集名词-->
          <typeAlias alias="DatabaseLogger" type="ConsoleApplication1.UnityDI.DatabaseLogger, ConsoleApplication1" />
          <typeAlias alias="TextFileLogger" type=" ConsoleApplication1.UnityDI.TextFileLogger,  ConsoleApplication1" />
          <typeAlias alias="ILogger" type=" ConsoleApplication1.UnityDI.ILog,  ConsoleApplication1" />
        </typeAliases>
        <containers>
          <container>
            <types>
              <!--type是接口,mapto是目标实例化对象-->
              <type type="ILogger" mapTo="DatabaseLogger" >
                <lifetime type="singleton" />
              </type>
            
            </types>
          </container>
        </containers>
      </unity>
    使用的时候注意添加Microsoft.Practices.Unity.Configuration.dll
    然后通过代码这样就可以使用。通过配置文件中mapto的不同,实例化不同的接口对象
      IUnityContainer container = new UnityContainer();
               
                UnityConfigurationSection config = ConfigurationManager.GetSection("unity") as UnityConfigurationSection;
                config.Configure(container);

                ILog defaultLogger = container.Resolve<ILog>();
                defaultLogger.Write(" hello Unity!");


    微软企业库5.0的手册中有关于unity的文档,其他地方好像真找不到
    http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=6932
    其他msdn资料http://msdn.microsoft.com/en-us/library/ff660923%28v=PandP.20%29.aspx

    本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。

  • 相关阅读:
    leetcode 78. 子集 JAVA
    leetcode 91. 解码方法 JAVA
    leetcode 75. 颜色分类 JAVA
    leetcode 74 搜索二维矩阵 java
    leetcode 84. 柱状图中最大的矩形 JAVA
    last occurance
    first occurance
    classical binary search
    LC.234.Palindrome Linked List
    LC.142. Linked List Cycle II
  • 原文地址:https://www.cnblogs.com/zjypp/p/2319268.html
Copyright © 2011-2022 走看看