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();
}
}
}
啟動調試,讓我們來看看輸出結果:
小明用刀殺怪