.NET中IoC框架Autofac用法講解

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();
        }
    }
}

啟動調試,讓我們來看看輸出結果:

小明用刀殺怪

到此這篇關於.NET中IoC框架Autofac用法講解的文章就介紹到這瞭。希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: