Autofac一个优秀的.NET IoC框架(转载)

2021年09月15日 阅读数:1
这篇文章主要向大家介绍Autofac一个优秀的.NET IoC框架(转载),主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

 

1 前置阅读

在阅读本文章以前,你能够先阅读:web

  • 什么是依赖注入
2 简介

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

3 使用

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

Autofac
Autofac一个优秀的.NET IoC框架(转载)_ide

而后,咱们经过建立ContainerBuilder来注册组件。学习

var builder = new ContainerBuilder();
builder.RegisterType<Knife>();
builder.RegisterType<Actor>();
Autofac一个优秀的.NET IoC框架(转载)_ide

接着,能够经过在一个已存在的生命周期上调用 BeginLifetimeScope() 方法来建立另外一个生命周期做用域, 以根容器做为起始。生命周期做用域是可释放的而且追踪组件的释放, 所以确保你老是调用了 "Dispose()"" 或者把它们包裹在 "using" 语句内。ui

using (var scope = container.BeginLifetimeScope())
{
}
Autofac一个优秀的.NET IoC框架(转载)_ide

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

using (var scope = container.BeginLifetimeScope())
{
    var actor = scope.Resolve<Actor>();
    actor.Kill();
}
Autofac一个优秀的.NET IoC框架(转载)_ide

让咱们来看看完整代码:spa

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();
        }
    }
}
Autofac一个优秀的.NET IoC框架(转载)_ide

让咱们来看看输出结果:调试

小明用刀杀怪
Autofac一个优秀的.NET IoC框架(转载)_ide
4 在 Asp.Net Core 中使用

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

dotnet add package Autofac
dotnet add package Autofac.Extensions.DependencyInjection
Autofac一个优秀的.NET IoC框架(转载)_ide

而后,在Program.Main中增长.UseServiceProviderFactory(new AutofacServiceProviderFactory())生命周期

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        })
        .UseServiceProviderFactory(new AutofacServiceProviderFactory());
Autofac一个优秀的.NET IoC框架(转载)_ide

接着,在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();
}
Autofac一个优秀的.NET IoC框架(转载)_ide

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

public void ConfigureContainer(ContainerBuilder builder)
{
    builder.RegisterType<Knife>();
    builder.RegisterType<Actor>();
}
Autofac一个优秀的.NET IoC框架(转载)_ide

最后,增长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();
        }
    }
}
Autofac一个优秀的.NET IoC框架(转载)_ide

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

小明用刀杀怪
Autofac一个优秀的.NET IoC框架(转载)_ide