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

  • 相关阅读:
    【转】sql 如何设计数据库表实现完整的RBAC(基于角色权限控制)
    【转】windows自带终止进程的超强命令
    【源码】 gridview 里使用checkbox
    【转】调用 开始 运行 直接执行命令
    【源码】DropDownList绑定数据
    C++ 编译器数据类型差异
    Flash 中将不透明的 Bitmap 透明化处理
    使用命令行切换IP地址
    MKV 高清视频文件分解与封装和音频编码的转换
    Visual Studio 2010 C++ 用户属性设置
  • 原文地址:https://www.cnblogs.com/wuxl360/p/5421771.html
Copyright © 2011-2022 走看看