zoukankan      html  css  js  c++  java
  • ASP.NET WebApi项目框架搭建(三):依赖注入之Autofac

    一、前言

    在编程中,依赖注入是一种实现控制反转且用于解决依赖性问题的设计模式。一个依赖关系指的是可被利用的一种对象 。依赖注入是将所依赖的传递给将要使用的从属对象。该服务将会变成客户端状态的一部分并传递服务给客户端,而不允许客户端来建立或寻找服务。依赖注入使我们的编程代码变得松散耦合,易于管理。

    Autofac是.NET领域最为流行的IOC框架之一,传说是速度最快的一个:

    优点: 

    • 它是C#语言联系很紧密,也就是说C#里的很多编程方式都可以为Autofac使用,例如可以用Lambda表达式注册组件
    • 较低的学习曲线,学习它非常的简单,只要你理解了IoC和DI的概念以及在何时需要使用它们
    • XML配置支持
    • 自动装配
    • 与Asp.Net MVC 3集成
    • 微软的Orchad开源程序使用的就是Autofac,从该源码可以看出它的方便和强大
    • 简洁高效

    二、安装配置Autofac

    1.nuget安装Autofac和Autofac.WebApi2,注意版本要求

     2.新建AutoFac文件夹(F大写),新建组件注册类ContainerBuilerCommon来注册组件

    /// <summary>
        /// Autofac注册类
        /// </summary>
        public static class ContainerBuilerCommon
        {
            /// <summary>
            /// 注册方法
            /// </summary>
            /// <returns></returns>
            public static IContainer GetWebApiContainer()
            {
                var builder = new ContainerBuilder();
                // 注册webapi的所有控制器
                builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
                // 注册一个用于测试的组件Pserson。
                builder.RegisterType<Person>();
                return builder.Build();
            }
        }

    3.Global.asax文件加入以下代码配置autofac依赖注入

    public class WebApiApplication : System.Web.HttpApplication
        {
            protected void Application_Start()
            {
                // 获取webapi的配置
                var config = GlobalConfiguration.Configuration;
                // 获取webapi的依赖注入容器
                var container = ContainerBuilerCommon.GetWebApiContainer();
                // 配置webapi的依赖注入
                config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
                GlobalConfiguration.Configure(WebApiConfig.Register);
            }
        }

    三、使用autofac实现依赖注入

    1.之前我们在autofac注册类里面注册了Person类,下面我们在person类里面写一个Say方法

    public class Person
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public string Sex { get; set; }
            public int Age { get; set; }
    
            public string Say()
            {
                return "I'm Person Class";
            }
        }

    2.在Index控制器中添加Person类的变量,并在构造函数中赋值:

            protected Person _person;
    
            public IndexController(Person person)
            {
                _person = person;
            }

    3.新建一个get请求用来测试依赖注入,如果不适用依赖注入,我们想调用Person的say方法一般是Person p=new Person();p.Say(),有了依赖注入,我们只需要下面这样。

            /// <summary>
            /// 测试Autofac
            /// </summary>
            /// <returns></returns>
            [Route("autofac")]
            [HttpGet]
            public IHttpActionResult Autofac()
            {
                return Ok(_person.Say());
    
            }

    4.运行项目,测试接口,输出"I'm Person Class"。可以看到,我们并没有New一个Person类,就实现了调用Person的Say方法,其实是容器帮我们new了。

    四、总结

    上面的例子已经简单的实现了autofac的依赖注入,autofac的用法可总结为三步:

    1、创建container builder:

    var builder = new ContainerBuilder();

    2、注册组件:

    autofac怎么注册组件可以参考官网:https://autofaccn.readthedocs.io/zh/latest/

    3、生成依赖注入容器(如果是webapi则将容器传给webapi的DependencyResolver对象:  

    config.DependencyResolver = new AutofacWebApiDependencyResolver(container);

     

  • 相关阅读:
    【NOI2005T1】瑰丽华尔兹-DP单调队列优化
    【POJ1113】Wall-Graham-Scan算法求凸包
    【POJ1113】Wall-Graham-Scan算法求凸包
    【POJ2774】Long Long Message-求最长公共子串(后缀数组求法)
    【POJ2774】Long Long Message-求最长公共子串(后缀数组求法)
    【POJ2195】Going Home-最小费用最大流模板题
    【POJ2195】Going Home-最小费用最大流模板题
    【POJ1273】Drainage Ditches-最大流问题
    【POJ1273】Drainage Ditches-最大流问题
    codevs 1155 金明的预算方案
  • 原文地址:https://www.cnblogs.com/huguodong/p/12748845.html
Copyright © 2011-2022 走看看