zoukankan      html  css  js  c++  java
  • [Solution] 使用Autofac在MVC、Web API、WCF中实现IOC

    本来想聊一下面试过程的,1个星期面了6家,4家当场给offer,2家技术通过(1家没下文,1家复试).从中也学习到一些东西,先还是继续Coding吧.

     

    官网:http://autofac.org/

    下载:Install-Package Autofac -Version 3.5.2

    Autofac是轻量级的开源IOC容器,传说是速度最快的一个,同类的框架还有用过Castle Windsor、StructureMap、Unity、Spring.Net等.

    本节目录

    Hello World

    1.建立项目

    CA:一个控制台项目,引用Nuget Autofac包.

    2.建立一个依赖外部的类

        public class Test
        {
            public Test(string str)
            {
                Console.WriteLine("hello " + str);
            }
        }
    

    3.根据参数名直接注入

    static void Main(string[] args)
    {
      //创建容器工厂 var builder = new ContainerBuilder(); //注册Test类型到工厂中 builder.RegisterType<Test>();
      //通过工厂创建容器 using (var container = builder.Build()) {
        //解析Test并返回Test实例 container.Resolve<Test>(new NamedParameter("str", "world")); } Console.ReadKey(); }

    过程:首先需要创建容器工厂,然后将各种类型注册到工厂中,再创建容器,通过容器实例化对象.

    注入高级对象

    添加1个构造函数

    public Test(ISay say)
    {
        Console.WriteLine("say:" + say.Get());
    }
    

    接口及其实现

        public class Say : ISay
        {
            public string Get()
            {
                return "hello world";
            }
        }
    
        public interface ISay
        {
            string Get();
        }
    

    注入实现(Autofac会自动装配)

            static void Main(string[] args)
            {
                var builder = new ContainerBuilder();
    
                builder.RegisterType<Test>();
                builder.RegisterType<Say>().As<ISay>();
                using (var container = builder.Build())
                {
                    container.Resolve<Test>();
                }
                Console.ReadKey();
            }
    

    略作修改

         public Test(Say say)//将接口改为指定具体实现类
            {
                Console.WriteLine("say:" + say.Get());
            }
    

    此时运行代码会报错,因为在容器中我们只注册了ISay接口.改为As<Say>或以下方式

    builder.RegisterType<Say>().As<ISay>().AsSelf();
    

    对象生命周期

    注册到工厂的类型默认都调用InstancePerDependency方法.实现每个依赖都创建1个新实例

    单例模式:

                builder.RegisterType<Test>().SingleInstance();
    

    读取配置文件注入

    需要引用Nuget Autofac.Configuration包

    注册类型代码

    builder.RegisterModule(new ConfigurationSettingsReader("autofac"));
    

    App.config

      <configSections>
        <section name="autofac" type="Autofac.Configuration.SectionHandler, Autofac.Configuration" />
      </configSections>
      <autofac defaultAssembly="CA">
        <components>
          <component type="CA.Say, CA" service="CA.ISay" />
          <component type="CA.Say, CA" service="CA.Say" />
        </components>
      </autofac>
    

    service相当于As<T>中的T

    结合ASP.NET MVC

    1.Install-Package Autofac.Mvc5

    2.Application_Start事件添加此方法

            protected void Application_Start(object sender, EventArgs e)
            {
                #region 1.MVC Autofac注入
                var builder = new ContainerBuilder();
                //类名.EndsWith("Controller")
                builder.RegisterControllers(Assembly.GetExecutingAssembly());
                //这样既支持接口 又支持自己的类型
                builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
                    .AsImplementedInterfaces().AsSelf();
                //容器
                var container = builder.Build();
                //注入改为Autofac注入
                DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
                #endregion
    
                #region 2.注册MVC路由
                var routes = RouteTable.Routes;
                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
                );
                #endregion
            }
    

    3.带参数的控制器构造函数

        public class HomeController : Controller
        {
            public HomeController(Say say)
            {
                
            }
            public string Index()
            {
                return "Hello World";
            }
        }
    
        public class Say
        {
            public string Get()
            {
                return "Hello World";
            }
        }
    

    4.浏览器访问~/

    结合ASP.NET Web API

    1.Install-Package Autofac.WebApi

    2.由于WebAPI需要,引用系统自带Web.Http和Web.Http.WebHost

    3.Application_Start添加此方法

            protected void Application_Start(object sender, EventArgs e)
            {
                var configuration = GlobalConfiguration.Configuration;
                #region Autofac WebAPI注入
                var builder = new ContainerBuilder();
                builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
                builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).AsImplementedInterfaces().AsSelf();
                var container = builder.Build();
                configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container); 
                #endregion
    
                #region 注册Web API路由
                configuration.Routes.MapHttpRoute(
                         name: "DefaultApi",
                         routeTemplate: "api/{controller}/{id}",
                         defaults: new { id = RouteParameter.Optional }); 
                #endregion
            }
    

    4.带参数的控制器构造函数

        public class ValuesController : ApiController
        {
            public ValuesController(Say say)
            {
                
            }
            public string Get()
            {
                return "Hello World";
            }
        }
    
        public class Say
        {
            public string Get()
            {
                return "Hello World";
            }
        }
    

    5.浏览器访问~/api/values

    结合WCF

    1.Install-Package Autofac.Wcf

    2.Application_Start添加此方法

            protected void Application_Start(object sender, EventArgs e)
            {
                #region WCF Autofac注入
                var builder = new ContainerBuilder();
                builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).AsImplementedInterfaces().AsSelf();
                var container = builder.Build();
                //WCF IOC容器
                AutofacHostFactory.Container = container; 
                #endregion
            }
    

    3.新建svc服务

        public class TestService : ITestService
        {
            public TestService(Say say)
            {
    
            }
            public string DoWork()
            {
                return "Hello World";
            }
        }
    
        public class Say
        {
            public string Get()
            {
                return "Hello World";
            }
        }
    
        [ServiceContract]
        public interface ITestService
        {
            [OperationContract]
            string DoWork();
        }
    

    4.svc指令中加一句:

    Factory="Autofac.Integration.Wcf.AutofacServiceHostFactory, Autofac.Integration.Wcf" 

    5.wcftestclient

    惭愧,好久没发博客了

  • 相关阅读:
    车载OS盘点及特点分析一:车载OS几大系统介绍
    CTF常用软件/工具
    汽车软件产业研究报告(2020年)
    高级加密标准(AES)分析
    工具 | CTP、SimNow、NSight、快期
    CTF之图片隐写术解题思路
    V2X和车路协同研究:5G V2X将成为数字座舱标配
    腾讯安全正式发布《IoT安全能力图谱》
    Microsoft Remote Desktop Beta 下载地址
    密码学初探|加密模式
  • 原文地址:https://www.cnblogs.com/neverc/p/4914091.html
Copyright © 2011-2022 走看看