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

    本人新浪微博:http://weibo.com/i/1741159542

  • 相关阅读:
    POJ-3254 + POJ-1185 状压DP入门题
    POJ-3667 线段树区间合并入门题
    HDU-4507 数位DP 记录一个毒瘤错误orz
    HDU-4734 F(x)数位dp
    HDU-3709 Balanced Number 数位dp+枚举
    分块入门 LibreOJ分块九题
    HDU-4389 X mod f(x) && 2018上海大都会邀请赛J 数位dp
    HDU-3038 How Many Answers Are Wrong (带权并查集)
    Codeforces 608B Hamming Distance Sum (前缀和)
    (二十六 )数据库:水平切分,数据库秒级扩容!
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6773444.html
Copyright © 2011-2022 走看看