zoukankan      html  css  js  c++  java
  • Autofac是一个轻量级的依赖注入的框架

    Autofac是一个轻量级的依赖注入的框架

    ASP.NET Core 学习笔记 第三篇 依赖注入框架(Autofac)的使用

     

    前言

    首先感谢支持,写了这个系列的第二篇后,得到了好多人的鼓励,也更加坚定我把这个系列写完的决心,也能更好的督促自己的学习,分享自己的学习成果。还记得上篇文章中最后提及到,假如服务越来越多怎么处理呢,本篇文章将会带来解决办法。这篇是接上一篇文章的,概念方面的可以参考上一篇文章。

    IoC框架

    先说说常见的Ioc框架吧。
    Autofac: 目前net用的比较多,好多大佬的项目比较优先选择的框架。
    Ninject: 已经很少用了,还时在很早的文章中见过。
    Unity: 比较常见的了,好多地方有用到的,
    Core: Core中自带的,业务逻辑不太复杂的情况下,还是比较方便的。

    IoC-Autofac

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

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

    大多数讲Autofac框架的文章中都会提及上面几点优点,可见其框架的优秀。

    .NET Core中自带DI的使用

    1.首先创建一个 ASP.Net Core Web Api项目(选用的.NET 5.0),整体如下,红色部分为Core中自带DI使用的部分。

    image

    2.新建类库项目,分别添加一个接口文件和类文件。

    接口:

        public interface ISayHelloService
        {
            string SayHello(string name);
        }
    

    类:

        public class EnglishSayHelloService : ISayHelloService
        {
            public string SayHello(string name)
            {
                return $"Hello,{name}!";
            }
        }
    

    3.在 Startup 里面的 ConfigureServices 方法内注入。

     services.AddScoped<ISayHelloService, EnglishSayHelloService>();
    

    4.然后在控制器中使用刚刚注入的服务。

        [Route("api/[controller]/[action]")]
        [ApiController]
        public class HelloController : ControllerBase
        {
            public readonly ISayHelloService sayHelloService;
    
            public HelloController(ISayHelloService sayHelloService)
            {
                this.sayHelloService = sayHelloService;
            }
    
            [HttpGet]
            public string CoreDI()
            {
                return  sayHelloService.SayHello("CoreDI");
            }
    
        }
    

    注意: 路由访问地址,出现404错误时,可能是路由问题,路由可根据自己的实际需要自己在[Route("api/[controller]/[action]")]处修改。

    5.访问测试。

    image
    这里使用的接口测试软件是Postman,Api测试很方便,网上可以搜索到,找不到我到的可以联系我。

    Autofac 使用

    1.在新建一个ASP.Net Core Web Api项目(选用的.NET 5.0)用于区分前面的Core自带的DI。

    image

    2.引用引用 Autofac 的包,看看这下载量,还是很哇塞的

    image

    3.在 Program 中改用 Autofac 来实现依赖注入

        public class Program
        {
            public static void Main(string[] args)
            {
                CreateHostBuilder(args).Build().Run();
            }
    
            public static IHostBuilder CreateHostBuilder(string[] args) =>
                Host.CreateDefaultBuilder(args)
                    .ConfigureWebHostDefaults(webBuilder =>
                    {
                        webBuilder.UseStartup<Startup>();
                    });
        }
    

    4.在 Startup 类中添加方法:ConfigureContainer,注入我们之前的服务。

        public class Startup
        {
            public Startup(IConfiguration configuration)
            {
                Configuration = configuration;
            }
    
            public IConfiguration Configuration { get; }
    
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddControllers();
            }
            //在这里注入
            public void ConfigureContainer(ContainerBuilder builder)
            {
                builder.RegisterType<EnglishSayHelloService>().As<ISayHelloService>();
             
            }
         
            public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
    
                app.UseRouting();
    
                app.UseAuthorization();
    
                app.UseEndpoints(endpoints =>
                {
                    endpoints.MapControllers();
                });
            }
                
        }
    

    5.控制器这里基本不需要更改。

        [Route("api/[controller]/[action]")]
        [ApiController]
        public class HelloController : ControllerBase
        {
            public readonly ISayHelloService sayHelloService;
    
            public HelloController(ISayHelloService sayHelloService)
            {
                this.sayHelloService = sayHelloService;
            }
    
            [HttpGet]
            public string CoreDI()
            {
                return  sayHelloService.SayHello("AutofacDI");
            }
    
        }
    

    6.运行项目继续用Postman测试接口。

    image
    好了关于Autofac的基本使用基本就讲完了,是不是还是挺简单的。

    批量注入

    简单的几个服务写着还可以接受,当服务到几十个,甚至上百个时,想想就可怕。这就不得不说到批量注入了,Autofac的优势就体现出来了。
    1.在服务中分别在添加一个接口,和类。
    接口:

       public interface IUseAutofacService
       {
           string UseAutofac(string name);
       }
    

    类:

       public class UseAutofacService : IUseAutofacService
       {
           public string UseAutofac(string name)
           {
               return $"{name}批量注入测试!";
           }
       }
    

    2.回到我们之前的Startup 类中修改方法:ConfigureContainer。

           public void ConfigureContainer(ContainerBuilder builder)
           {
               //builder.RegisterType<EnglishSayHelloService>().As<ISayHelloService>();
    
               //服务项目程序集
               Assembly service = Assembly.Load("Autofac.Service");
              
               //服务接口项目程序集
               Assembly iservice = Assembly.Load("Autofac.Service");
    
               builder.RegisterAssemblyTypes(service, iservice).Where(n => n.FullName.EndsWith("Service") && !n.IsAbstract)
                   .InstancePerLifetimeScope().AsImplementedInterfaces();
    
           }
    

    注意: 如果需要注入的服务没有 IXXXService的接口 ,那么 builder.RegisterAssemblyTypes 就只需要传一个程序集。如果服务与接口同在一个项目,那也是要传两个程序集的。

    3.接下来在刚刚的控制器中略作修改。

        [Route("api/[controller]/[action]")]
        [ApiController]
        public class HelloController : ControllerBase
        {
            public readonly ISayHelloService sayHelloService;
    
            public readonly IUseAutofacService useAutofacService;
    
            public HelloController(ISayHelloService _sayHelloService, IUseAutofacService _useAutofacService)
            {
                this.sayHelloService = _sayHelloService;
                this.useAutofacService = _useAutofacService;
            }
    
            [HttpGet]
            public string AutofacDI()
            {
                return sayHelloService.SayHello("AutofacDI");
            }
    
            public string BathAutofacDI()
            {
                var name = sayHelloService.SayHello("AutofacDI");
                return useAutofacService.UseAutofac(name);
            }
        }
    

    4.用Postman测试注入的情况。

    image

     
    分类: ASP.NET Core
    摘要:一、基本配置 1、通过配置的方式使用Autofac 2、通过RegisterModule方式使用配置文件中的信息 static void Main(string[] args) { ContainerBuilder builder = new ContainerBuilder(); builder.RegisterType(); builder.RegisterModule(new ConfigurationSettingsReader("a... 阅读全文
    posted @ 2014-03-25 19:44 逆心 阅读(8215) 评论(6) 推荐(1) 编辑
     
    摘要:一、组件 创建出来的对象需要从组件中来获取,组件的创建有如下4种(延续第一篇的Demo,仅仅变动所贴出的代码)方式: 1、类型创建RegisterType AutoFac能够通过反射检查一个类型,选择一个合适的构造函数,创造这个对象的实例。主要通过RegisterType() 和 RegisterType(Type) 两个方法以这种方式建立。 ContainerBuilder使用 As() 方法将Component封装成了服务使用。 builder.RegisterType(); builder.RegisterType().As(); 2、实例创建 builder.R... 阅读全文
    posted @ 2014-03-19 16:54 逆心 阅读(25874) 评论(13) 推荐(31) 编辑
     
    摘要:Autofac是一个轻量级的依赖注入的框架,同类型的框架还有Spring.NET,Unity,Castle等。 Autofac的使用有一个非常让人郁闷的地方,就是服务器要求安装有Microsoft .NET Framework 4 KB2468871。该补丁的地址是:http://www.microsoft.com/zh-cn/download/confirmation.aspx?id=3556 如果不安装,则运行程序会报如下错误: 具体信息可以到这里去查看:https://code.google.com/p/autofac/wiki/FrequentlyAskedQuestion... 阅读全文
    posted @ 2014-03-19 15:00 逆心 阅读(5870) 评论(2) 推荐(10) 编辑
    作者:Leo_wl
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    版权信息
  • 相关阅读:
    cinder支持nfs快照
    浏览器输入URL到返回页面的全过程
    按需制作最小的本地yum源
    创建可执行bin安装文件
    RPCVersionCapError: Requested message version, 4.17 is incompatible. It needs to be equal in major version and less than or equal in minor version as the specified version cap 4.11.
    惠普IPMI登陆不上
    Linux进程状态——top,ps中看到进程状态D,S,Z的含义
    openstack-neutron基本的网络类型以及分析
    openstack octavia的实现与分析(二)原理,架构与基本流程
    flask上下文流程图
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/15737263.html
Copyright © 2011-2022 走看看