Autofac在.NET Core 中的使用

前言

Autofac 是一款.NET IoC 容器 . 它管理類之間的依賴關係, 從而使應用在規模及複雜性增長的情況下依然可以輕易地修改 。
.NET CORE 中也內置了依賴注入,但是有些情況下需要用到Autofac去進行依賴注入,Autofac支持的所有注入方式以外,還支持屬性注入和方法注入。接下來我們通過示例來簡單瞭解Autofac的使用

示例

新建兩個.NET CORE 項目,一個WEB層,一個服務層
在這裏插入圖片描述
服務層中添加幾個測試服務和模塊文件
在這裏插入圖片描述
服務代碼都如圖所示
在這裏插入圖片描述
引入Autofac Nuget包文件
在這裏插入圖片描述

NetCoreAutofacServiceModule 類繼承Autofac.Module,並重寫Autofac管道中的Load方法,如下圖多種方式注入服務。
在這裏插入圖片描述
接下來就是在WEB層配置Autofac,這裏需要注意的是.Net Core2+ 和 .Net Core3+ 的配置方法稍有不同

.NET CORE 2+

在NET Core 2.1時候,AutoFac返回一個 IServiceProvider 參數注入到ConfigureServices .NET Core 服務中,寫法如下:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    return AutofacProvider.RegisterForNetCore2(services);
}
//將定義的策略和AutoFac 一起替換內置DI
public static IServiceProvider RegisterForNetCore2(IServiceCollection services) {
    var builder = new ContainerBuilder();
    builder.Populate(services);
    //按模塊注入服務
    builder.RegisterModule<NetCoreAutofacServiceModule>(); 
    var Container = builder.Build();
    return new AutofacServiceProvider(Container);
}

.NET CORE 3+

在.NET Core3.0 使用上面的寫法,框架運行之後會報錯:

ConfigureServices returning an System.IServiceProvider isn’t supported.

.NET Core 3.0 引入了具有強類型容器配置的功能。它提供了 ConfigureContainer 方法,可以在其中使用Autofac來註冊事物,而不必通過 ServiceCollection 來註冊事物。首先需要在 Program.cs 中修改服務工廠,內置是 ServiceProviderFactory 的,修改指定爲: AutofacServiceProviderFactory 。

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

然後在 Startup.cs 中添加方法 ConfigureContainer ,並配置Autofac策略

public void ConfigureContainer(ContainerBuilder builder)
{
    AutofacProvider.RegisterForNetCore3(builder);
}
public static void RegisterForNetCore3(ContainerBuilder builder)
{
    builder.RegisterModule<NetCoreAutofacServiceModule>();
}

最後在控制器中依賴注入服務,可以在方法上用[FromServices]注入,也可以通過構造函數注入

[HttpGet]
[Route("GetName")]
public string GetName([FromServices] IThreeRepository threeRepository, 
    [FromServices] IOneService oneService,
    [FromServices] ITwoService twoService)
{
    return $"【threeRepository】 : {threeRepository.GetName()}; 【oneService】 : {oneService.GetName()} ; 【twoService】 : {twoService.GetName()}";
}

啓動服務看看結果
在這裏插入圖片描述
服務已經註冊成功
ThreeRepository 與 IThreeRepository 通過 RegisterType 方法註冊;

builder.RegisterType<ThreeRepository>().AsImplementedInterfaces();

OneService、IOneService、TwoService、ITwoService 則是通過RegisterAssemblyTypes方式註冊;

builder.RegisterAssemblyTypes(typeof(NetCoreAutofacServiceModule).Assembly).Where(a => a.Name.EndsWith("Service")).AsImplementedInterfaces();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章