1、Autofac IOC 容器 ,便于在其他类获取注入的对象
using System;using System.Collections.Generic;using System.Linq;using System.Reflection;using Autofac;using Autofac.Core;using Autofac.Extensions.DependencyInjection;using Microsoft.Extensions.DependencyInjection;namespace BackToCOS.IoC{ ???/// <summary> ???/// Autofac IOC 容器 ???/// </summary> ???public class AutofacContainer ???{ ???????private static ContainerBuilder _builder = new ContainerBuilder(); ???????private static IContainer _container; ???????private static string[] _otherAssembly; ???????private static List<Type> _types = new List<Type>(); ???????private static Dictionary<Type, Type> _dicTypes = new Dictionary<Type, Type>(); ???????/// <summary> ???????/// 注册程序集 ???????/// </summary> ???????/// <param name="assemblies">程序集名称的集合</param> ???????public static void Register(params string[] assemblies) ???????{ ???????????_otherAssembly = assemblies; ???????} ???????/// <summary> ???????/// 注册类型 ???????/// </summary> ???????/// <param name="types"></param> ???????public static void Register(params Type[] types) ???????{ ???????????_types.AddRange(types.ToList()); ???????} ???????/// <summary> ???????/// 注册程序集。 ???????/// </summary> ???????/// <param name="implementationAssemblyName"></param> ???????/// <param name="interfaceAssemblyName"></param> ???????public static void Register(string implementationAssemblyName, string interfaceAssemblyName) ???????{ ???????????var implementationAssembly = Assembly.Load(implementationAssemblyName); ???????????var interfaceAssembly = Assembly.Load(interfaceAssemblyName); ???????????var implementationTypes = ???????????????implementationAssembly.DefinedTypes.Where(t => ???????????????????t.IsClass && !t.IsAbstract && !t.IsGenericType && !t.IsNested); ???????????foreach (var type in implementationTypes) ???????????{ ???????????????var interfaceTypeName = interfaceAssemblyName + ".I" + type.Name; ???????????????var interfaceType = interfaceAssembly.GetType(interfaceTypeName); ???????????????if (interfaceType.IsAssignableFrom(type)) ???????????????{ ???????????????????_dicTypes.Add(interfaceType, type); ???????????????} ???????????} ???????} ???????/// <summary> ???????/// 注册 ???????/// </summary> ???????/// <typeparam name="TInterface"></typeparam> ???????/// <typeparam name="TImplementation"></typeparam> ???????public static void Register<TInterface, TImplementation>() where TImplementation : TInterface ???????{ ???????????_dicTypes.Add(typeof(TInterface), typeof(TImplementation)); ???????} ???????/// <summary> ???????/// 注册一个单例实体 ???????/// </summary> ???????/// <typeparam name="T"></typeparam> ???????/// <param name="instance"></param> ???????public static void Register<T>(T instance) where T:class ???????{ ???????????_builder.RegisterInstance(instance).SingleInstance(); ???????} ???????/// <summary> ???????/// 构建IOC容器 ???????/// </summary> ???????public static IServiceProvider Build(IServiceCollection services) ???????{ ???????????if (_otherAssembly != null) ???????????{ ???????????????foreach (var item in _otherAssembly) ???????????????{ ???????????????????_builder.RegisterAssemblyTypes(Assembly.Load(item)); ???????????????} ???????????} ???????????if (_types != null) ???????????{ ???????????????foreach (var type in _types) ???????????????{ ???????????????????_builder.RegisterType(type); ???????????????} ???????????} ???????????if (_dicTypes != null) ???????????{ ???????????????foreach (var dicType in _dicTypes) ???????????????{ ???????????????????_builder.RegisterType(dicType.Value).As(dicType.Key); ???????????????} ???????????} ???????????_builder.Populate(services); ???????????_container = _builder.Build(); ???????????return new AutofacServiceProvider(_container); ???????} ???????/// <summary> ???????/// ????????/// </summary> ???????/// <typeparam name="T"></typeparam> ???????/// <returns></returns> ???????public static T Resolve<T>() ???????{ ???????????return _container.Resolve<T>(); ???????} ???????public static T Resolve<T>(params Parameter[] parameters) ???????{ ???????????return _container.Resolve<T>(parameters); ???????} ???????public static object Resolve(Type targetType) ???????{ ???????????return _container.Resolve(targetType); ???????} ???????public static object Resolve(Type targetType, params Parameter[] parameters) ???????{ ???????????return _container.Resolve(targetType, parameters); ???????} ???}}
2、用nuget安装
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
3、Program类如下
1 using BackToCOS.IoC; 2 using log4net; 3 using Microsoft.Extensions.Configuration; 4 using Microsoft.Extensions.DependencyInjection; 5 using Microsoft.Extensions.Logging; 6 using Myvas.AspNetCore.TencentCos; 7 using System; 8 using System.IO; 9 using Topshelf;10 11 namespace BackToCOS12 {13 ????class Program14 ????{15 ????????static void Main(string[] args)16 ????????{17 ????????????var configuration = new ConfigurationBuilder()18 ??????????????.SetBasePath(Directory.GetCurrentDirectory())19 ??????????????.AddJsonFile("appsettings.json", true, true)20 ??????????????.AddJsonFile("appsettings.Development.json", true, true)21 ??????????????.Build();22 ????????????IServiceCollection services = new ServiceCollection();23 ??????????24 ????????????services.AddTencentCos(options =>25 ????????????{26 ????????????????options.SecretId = configuration["TencentCos:SecretId"];27 ????????????????options.SecretKey = configuration["TencentCos:SecretKey"];28 ????????????});29 ????????????services.AddLogging(builder => builder30 ???????????????.AddConfiguration(configuration.GetSection("Logging"))31 ???????????????.AddConsole());32 ????????????//注入33 ????????????services.AddSingleton<ITencentCosHandler, TencentCosHandler>();34 ????????????//用Autofac接管35 ????????????AutofacContainer.Build(services);36 ????????????log4net.Config.XmlConfigurator.ConfigureAndWatch(LogManager.CreateRepository("NETCoreRepository"), new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config"));37 ????????????HostFactory.Run(x =>38 ????????????{39 ????????????????x.UseLog4Net();40 ????????????????x.Service<BackupServiceRunner>();41 ????????????????x.RunAsLocalSystem();42 ????????????????x.SetDescription("备份到cos的服务");43 ????????????????x.SetDisplayName("备份到cos的服务");44 ????????????????x.SetServiceName("BackToCOS");45 ????????????????x.EnablePauseAndContinue();46 ????????????});47 ????????}48 ????}49 50 }
4、用容器获取事例(非构造函数)
1 using log4net; 2 using Microsoft.Extensions.Options; 3 using Myvas.AspNetCore.TencentCos; 4 using Quartz; 5 using System; 6 using System.Collections.Generic; 7 using System.Text; 8 using System.Threading.Tasks; 9 10 namespace BackToCOS.Jobs11 {12 ????//DisallowConcurrentExecution属性标记任务不可并行13 ????[DisallowConcurrentExecution] 14 ????public class BackupJob : IJob15 ????{16 ????????private readonly ILog _log = LogManager.GetLogger("NETCoreRepository", typeof(BackupJob));17 ????????public Task Execute(IJobExecutionContext context)18 ????????{19 ????????????try20 ????????????{21 ????????????????_log.Info("测试任务,当前系统时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));22 ????????????????ITencentCosHandler tencentCosHandler = IoC.AutofacContainer.Resolve<ITencentCosHandler>();23 ????????????????var ss = tencentCosHandler.AllBucketsAsync();24 ????????????????return Task.CompletedTask;25 ????????????}26 ????????????catch (Exception ex)27 ????????????{28 ????????????????JobExecutionException e2 = new JobExecutionException(ex);29 ????????????????_log.Error("测试任务异常", ex);30 ????????????}31 ????????????return Task.CompletedTask;32 ????????}33 ????}34 }
.net core 控制台程序使用依赖注入(Autofac)
原文地址:https://www.cnblogs.com/pengwen135/p/10019426.html