• C#实例 Unity依赖注入使用


    Unity是一个轻量级的可扩展的依赖注入容器,支持构造函数,属性和方法调用注入。Unity可以处理那些从事基于组件的软件工程的开发人员所面对的问 题。构建一个成功应用程序的关键是实现非常松散的耦合设计。下面介绍一下c#中使用unity的方法(我是以webapi项目为例,但本例中并没有针对 webapi做特殊处理)

    1.新建一个mvc4 webapi项目,下面的例子只用到get方法

    2.用nuget安装unity,如图

    3.新建一个接口类,以及继承该接口的两个类

    直接在api/values的get中尝试简单实现unity

    using (IUnityContainer container = new UnityContainer())

                {

                    container.RegisterType<IBook, BBook>();

                    IBook a = container.Resolve<IBook>();

                    var strResult = a.Write();

                    return strResult;

                }  

    然后在浏览器中查看,页面显示的返回值,是BBook的

    如果container.RegisterType<IBook, BBook>();中的BBook改为ABook,返回值就是ABook的内容

    config中代码如下

    在configSections中加入

    <section name="unity"

    type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />

      

    在configuration中加入

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

        <container>

          <register type="testunity.Models.IBook,testunity" mapTo="testunity.Models.ABook, testunity" />

        </container>

      </unity>

    注意 type="testunity.Models.IBook,testunity" mapTo="testunity.Models.ABook, testunity" 

    testunity.Models.IBook是命名空间加类名

    testunity是程序集的名称

    然后cs的代码改成

    using (IUnityContainer container = new UnityContainer())

    {

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

        configuration.Configure(container);

        IBook a = container.Resolve<IBook>();

        var strResult = a.Write();

        return strResult;

    }   

    在浏览器中可以看到返回结果对应的是config中register的那个类

    每次调用都要写IUnityContainer container = new UnityContainer()显然不是好办法

    那就把container封装到一个单列类中

    简单实现如下

    public class ServiceLocator:IServiceProvider

        {

            private readonly IUnityContainer _container;

            private static readonly ServiceLocator instance = new ServiceLocator();

            private ServiceLocator()

            {

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

                _container = new UnityContainer();

                section.Configure(_container);

            }

            public static ServiceLocator Instance

            {

                get { return instance; }

            }

            public object GetService(Type serviceType)

            {

                return _container.Resolve(serviceType);

            }

            public T GetService<T>()

            {

                return _container.Resolve<T>();

            }

        }

    cs代码修改如下

    IBook a = ServiceLocator.Instance.GetService<IBook>();

    var strResult = a.Write();

    return strResult;

  • 相关阅读:
    QT学习笔记——06-Day16_C++_QT
    QT学习笔记——06-Day15_C++_QT
    QT学习笔记——06-Day14_C++_QT
    c++提高学习笔记——05-c++STLday13_贪吃蛇案例
    c++提高学习笔记——05-c++STLday12
    c++提高学习笔记——05-c++STLday11
    混子的 后缀数组 刷题记录
    POJ2528Mayor's posters 线段树,离散化技巧
    莫比乌斯反演 刷题记录
    P问题,NP问题,NPC问题学习笔记
  • 原文地址:https://www.cnblogs.com/wuxl360/p/5421771.html
Copyright © 2020-2023  润新知