zoukankan      html  css  js  c++  java
  • Autofac一个优秀的.NET IoC框架

    1 前置阅读

    在阅读本文章之前,你可以先阅读:

    • 什么是依赖注入

    2 简介

    Autofac与C#语言的结合非常紧密,并学习它非常的简单,也是.NET领域最为流行的IoC框架之一。

    3 使用

    首先,将Autofac的NuGet软件包安装到您的应用程序中。

    Autofac
    

    然后,我们通过创建ContainerBuilder来注册组件。

    var builder = new ContainerBuilder();
    builder.RegisterType<Knife>();
    builder.RegisterType<Actor>();
    

    接着,可以通过在一个已存在的生命周期上调用 BeginLifetimeScope() 方法来创建另一个生命周期作用域, 以根容器作为起始。生命周期作用域是可释放的并且追踪组件的释放, 因此确保你总是调用了 "Dispose()"" 或者把它们包裹在 "using" 语句内。

    using (var scope = container.BeginLifetimeScope())
    {
    }
    

    最后,在注册完组件并暴露相应的服务后, 你可以从创建的容器或其子生命周期中解析服务. 让我们使用 Resolve() 方法来实现:

    using (var scope = container.BeginLifetimeScope())
    {
        var actor = scope.Resolve<Actor>();
        actor.Kill();
    }
    

    让我们来看看完整代码:

    using System;
    
    namespace Autofac.ConsoleApp
    {
        class Program
        {
            static void Main(string[] args)
            {
                var builder = new ContainerBuilder();
                builder.RegisterType<Knife>();
                builder.RegisterType<Actor>();
    
                var container = builder.Build();
                using (var scope = container.BeginLifetimeScope())
                {
                    var actor = scope.Resolve<Actor>();
                    actor.Kill();
                }
    
                Console.ReadKey();
            }
        }
    }
    

    让我们来看看输出结果:

    小明用刀杀怪
    

    4 在 Asp.Net Core 中使用

    首先,将Autofac,Autofac.Extensions.DependencyInjection的NuGet软件包安装到您的应用程序中。

    dotnet add package Autofac
    dotnet add package Autofac.Extensions.DependencyInjection
    

    然后,在Program.Main中增加.UseServiceProviderFactory(new AutofacServiceProviderFactory())

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            })
            .UseServiceProviderFactory(new AutofacServiceProviderFactory());
    

    接着,在Startup.ConfigureServices中增加services.AddControllersWithViews();

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new OpenApiInfo { Title = "Autofac.WebApi", Version = "v1" });
        });
    
        services.AddControllersWithViews();
    }
    

    接着,在Startup.ConfigureContainer方法中,将Knife,Actor注册到Autofac中ContainerBuilder。

    public void ConfigureContainer(ContainerBuilder builder)
    {
        builder.RegisterType<Knife>();
        builder.RegisterType<Actor>();
    }
    

    最后,增加HomeController,执行actor.Kill。

    using Microsoft.AspNetCore.Mvc;
    using System;
    
    namespace Autofac.WebApi.Controllers
    {
        [Route("[controller]")]
        [ApiController]
        public class HomeController : Controller
        {
    
            private readonly Actor actor;
            public HomeController(Actor actor)
            {
                this.actor = actor ?? throw new ArgumentNullException(nameof(actor));
            }
    
            [HttpGet]
            public string Get()
            {
                return actor.Kill();
            }
        }
    }
    

    启动调试,让我们来看看输出结果:

    小明用刀杀怪
    
  • 相关阅读:
    JDK,JRE,JVM,三者,你知道它们的关系么
    Linux防火墙机制
    mysql数据可以连接到myeclipse当中需要知道的语法
    mysql数据库常用命令
    修改mysql默认编码重启后又还原,且在修改my.ini配置文件出现1067错误的解决办法。
    MySQL 5.5 Command Line Client 打开出现闪退(错误)的解决办法
    修改mysql 的初始密码
    linux命令的续行,linux shell 参数换行(标准说法:续行)
    java面试(反射)05
    java面试(进程和线程)04
  • 原文地址:https://www.cnblogs.com/zcqiand/p/14257650.html
Copyright © 2011-2022 走看看