引言
首先聲明,本文使用的.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容器)](