如何在控制檯中集成AutoFac,一文搞懂!

引言

首先聲明,本文使用的.NetCore版本是3.0以上,有使用後感受不一致的同窗請首先檢查本身的版本問題。web

場景說明:json

NetCore的不少輪子和案例是基於NetCoreWeb的,畢竟Web的應用場景比較多,因此網上的文章也會多一些。 在NetCoreWeb中有咱們熟知的Startup.cs 文件,其中有倆個重要的方法api

public void ConfigureServices(IServiceCollection services)
{
	//註冊其餘庫提供的擴展方法
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{	
	//註冊管道事件
}

相信你們看到這倆個方法會以爲倍感親切,經過幾個例子來讓你們回憶加快跨域

services.AddControllers() //控制器服務
services.AddCorsAccessor()//跨域服務

若是要注入自定義的類,咱們能夠經過如下三種方式app

services.AddScoped();//請求做用域
services.AddTransient();//瞬時
services.AddSingleton();//單例

上文的內容相信你們看一下也就都瞭解了。ide

那麼問題來了,有些應用咱們不想弄web項目,太大太雜。我就想整一個控制檯項目,用到什麼添加什麼。那這個時候咱們如何利用依賴注入來實現和上文同樣的效果呢?函數

控制檯應用

core版本3.0以上,在此重申一下。測試

默認依賴注入

其實咱們仔細看NetCoreWeb的初始項目能夠發現,在Program.cs下Main方法能夠看到了個初始執行函數。ui

public static void Main(string[] args)
{
    CreateHostBuilder(args).Build().Run();
}

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

Host.CreateDefaultBuilder其實就是在構造一個Host主機,自定義的內容使用StartUp中的倆個方法進行配置,最後.Run生成一個新的主機實例,就是一個服務 。.net

那麼在控制檯下有沒有類似的方式 ,答案是有的。上代碼

var builder = new HostBuilder()
     .ConfigureServices((context, services) => { });

await builder.RunConsoleAsync();

new HostBuilder() Host.CreateDefaultBuilder() 這倆個方法是否是感受是同樣的,只是表現形式不同,沒錯,你猜對了。

經過上文的方式就能夠在控制檯項目中建立一個host主機,ConfigureServices也能夠正常使用,也能夠點出本身須要的內容,例如

var builder = new HostBuilder()
     .ConfigureAppConfiguration((context, config) =>
     {
         var env = context.HostingEnvironment;
         config.SetBasePath(AppDomain.CurrentDomain.BaseDirectory);
         config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
     })
     .ConfigureLogging(loggerFactory =>
     {
         loggerFactory.ClearProviders();

         //日誌使用NLog
         loggerFactory.AddNLog();
     })

使用第三方依賴注入庫如何集成

第三方庫選擇Autofac,相信你們都沒有意見吧。:happy:

有些時候咱們會有一些本身定製化的注入規則,例如按照某個特性標籤才注入,某些前綴,某些後綴注入,使用接口方式注入。這些規則若是用自帶api實現就會很不舒服,全部使用Autofac。

如何將Autofac繼承Core控制檯,我是真的找了好多文章才找到一個有用的,而後經過本身的實踐測試發現可靠,特此分享給你們。

一、Nuget引入 Autofac.Extensions.DependencyInjection 包

nuget install  Autofac.Extensions.DependencyInjection

二、替換默認依賴注入工廠

.UseServiceProviderFactory(new AutofacServiceProviderFactory())

三、使用Autofac服務

.ConfigureServices((context, services) =>
{
	services.AddAutofac();
}

四、配置本身的注入規則

.ConfigureContainer<ContainerBuilder>(builders =>
{
    var IServices = Assembly.Load("Service.BLL");
    builders.RegisterAssemblyTypes(IServices)
    .Where(t => t.GetInterfaces().Contains(typeof(IDbBLL)))
    .AsImplementedInterfaces()
    .EnableInterfaceInterceptors();//接口注入實現

    builders.RegisterType<RedisBLL>();//注入自定義類
})

五、整合測試

var builder = new HostBuilder()
     .ConfigureAppConfiguration((context, config) =>
     {
         var env = context.HostingEnvironment;
         config.SetBasePath(AppDomain.CurrentDomain.BaseDirectory);
         config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
     })
     .UseServiceProviderFactory(new AutofacServiceProviderFactory())
     .ConfigureContainer<ContainerBuilder>(builders =>
     {
         var IServices = Assembly.Load("Service.BLL");
         builders.RegisterAssemblyTypes(IServices)
           .Where(t => t.GetInterfaces().Contains(typeof(IDbBLL)))
           .AsImplementedInterfaces()
           .EnableInterfaceInterceptors();
     })
     .ConfigureServices((context, services) =>
     {
         services.AddAutofac();
         
         //測試服務 
         //services.AddHostedService<DemoService>();
     });

總結

經過文章的案例,相信你們對Autofac在控制檯中的使用已經有了一個初步的理解,下面就是實踐了。看的多不如作的多,不要讓眼睛記住一,腦子還沒記住。

參考

[Asp.net Core依賴注入(Autofac替換IOC容器)](

相關文章
相關標籤/搜索