Autofac一個優秀的.NET IoC框架

1 前置閱讀

在閱讀本文章之前,你可以先閱讀:

什麼是依賴注入

2 簡介

Autofac與C#語言的結合非常緊密,並學習它非常的簡單,也是。NET領域最為流行的IoC框架之一。

3 使用

首先

,將Autofac的NuGet軟體包安裝到您的應用程式中。

Autofac

然後

,我們透過建立ContainerBuilder來註冊元件。

var builder = new ContainerBuilder();builder。RegisterType();builder。RegisterType();

接著

,可以透過在一個已存在的生命週期上呼叫 BeginLifetimeScope() 方法來建立另一個生命週期作用域, 以根容器作為起始。生命週期作用域是可釋放的並且追蹤元件的釋放, 因此確保你總是呼叫了 “Dispose()”“ 或者把它們包裹在 ”using“ 語句內。

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

最後

,在註冊完元件並暴露相應的服務後, 你可以從建立的容器或其子生命週期中解析服務。 讓我們使用 Resolve() 方法來實現:

using (var scope = container。BeginLifetimeScope()){ var actor = scope。Resolve(); actor。Kill();}

讓我們來看看完整程式碼:

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

讓我們來看看輸出結果:

小明用刀殺怪

4 在 Asp.Net Core 中使用

首先

,將Autofac,Autofac。Extensions。DependencyInjection的NuGet軟體包安裝到您的應用程式中。

dotnet add package Autofacdotnet add package Autofac。Extensions。DependencyInjection

然後

,在Program。Main中增加。UseServiceProviderFactory(new AutofacServiceProviderFactory())

public static IHostBuilder CreateHostBuilder(string[] args) => Host。CreateDefaultBuilder(args) 。ConfigureWebHostDefaults(webBuilder => { webBuilder。UseStartup(); }) 。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(); builder。RegisterType();}

最後

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

啟動除錯,讓我們來看看輸出結果:

小明用刀殺怪