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