.net core 控制台程序使用依赖注入(Autofac)
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类如下
using BackToCOS.IoC;
using log4net;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Myvas.AspNetCore.TencentCos;
using System;
using System.IO;
using Topshelf; namespace BackToCOS
{
class Program
{
static void Main(string[] args)
{
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", true, true)
.AddJsonFile("appsettings.Development.json", true, true)
.Build();
IServiceCollection services = new ServiceCollection(); services.AddTencentCos(options =>
{
options.SecretId = configuration["TencentCos:SecretId"];
options.SecretKey = configuration["TencentCos:SecretKey"];
});
services.AddLogging(builder => builder
.AddConfiguration(configuration.GetSection("Logging"))
.AddConsole());
//注入
services.AddSingleton<ITencentCosHandler, TencentCosHandler>();
//用Autofac接管
AutofacContainer.Build(services);
log4net.Config.XmlConfigurator.ConfigureAndWatch(LogManager.CreateRepository("NETCoreRepository"), new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config"));
HostFactory.Run(x =>
{
x.UseLog4Net();
x.Service<BackupServiceRunner>();
x.RunAsLocalSystem();
x.SetDescription("备份到cos的服务");
x.SetDisplayName("备份到cos的服务");
x.SetServiceName("BackToCOS");
x.EnablePauseAndContinue();
});
}
} }
4、用容器获取事例(非构造函数)
using log4net;
using Microsoft.Extensions.Options;
using Myvas.AspNetCore.TencentCos;
using Quartz;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks; namespace BackToCOS.Jobs
{
//DisallowConcurrentExecution属性标记任务不可并行
[DisallowConcurrentExecution]
public class BackupJob : IJob
{
private readonly ILog _log = LogManager.GetLogger("NETCoreRepository", typeof(BackupJob));
public Task Execute(IJobExecutionContext context)
{
try
{
_log.Info("测试任务,当前系统时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
ITencentCosHandler tencentCosHandler = IoC.AutofacContainer.Resolve<ITencentCosHandler>();
var ss = tencentCosHandler.AllBucketsAsync();
return Task.CompletedTask;
}
catch (Exception ex)
{
JobExecutionException e2 = new JobExecutionException(ex);
_log.Error("测试任务异常", ex);
}
return Task.CompletedTask;
}
}
}
.net core 控制台程序使用依赖注入(Autofac)的更多相关文章
- 大比速:remoting、WCF(http)、WCF(tcp)、WCF(RESTful)、asp.net core(RESTful) .net core 控制台程序使用依赖注入(Autofac)
大比速:remoting.WCF(http).WCF(tcp).WCF(RESTful).asp.net core(RESTful) 近来在考虑一个服务选型,dotnet提供了众多的远程服务形式.在只 ...
- 如何在.NET Core控制台程序中使用依赖注入
背景介绍 依赖注入(Dependency Injection), 是面向对象编程中的一种设计原则,可以用来减低代码之间的耦合度.在.NET Core MVC中 我们可以在Startup.cs文件的Co ...
- 在.NET Core控制台程序中使用依赖注入
之前都是在ASP.NET Core中使用依赖注入(Dependency Injection),昨天遇到一个场景需要在.NET Core控制台程序中使用依赖注入,由于对.NET Core中的依赖注入机制 ...
- .Net Core控制台应用程序使用依赖注入、配置文件等
.Net Core作为一门新语言,资料实在是太少了,并且国内学习的人也不多,虽然性能还行也跨平台了但是生态圈不发展起来也不行 刚出来的时候用 .Net Core + Dapper + Mysql 弄了 ...
- .net core 依赖注入, autofac 简单使用
综述 ASP.NET Core 支持依赖注入, 也推荐使用依赖注入. 主要作用是用来降低代码之间的耦合度. 什么是控制反转? 控制反转(Inversion of Control,缩写为IoC),是面 ...
- NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
.NET Core 控制台程序没有 ASP.NET Core 的 IWebHostBuilder 与 Startup.cs ,那要读 appsettings.json.注依赖.配日志.设 IOptio ...
- ASP.NET Core中如影随形的”依赖注入”[下]: 历数依赖注入的N种玩法
在对ASP.NET Core管道中关于依赖注入的两个核心对象(ServiceCollection和ServiceProvider)有了足够的认识之后,我们将关注的目光转移到编程层面.在ASP.NET ...
- [ASP.NET Core 3框架揭秘] 依赖注入[5]: 利用容器提供服务
毫不夸张地说,整个ASP.NET Core框架是建立在依赖注入框架之上的.ASP.NET Core应用在启动时构建管道以及利用该管道处理每个请求过程中使用到的服务对象均来源于依赖注入容器.该依赖注入容 ...
- [ASP.NET Core 3框架揭秘] 依赖注入[7]:服务消费
包含服务注册信息的IServiceCollection集合最终被用来创建作为依赖注入容器的IServiceProvider对象.当需要消费某个服务实例的时候,我们只需要指定服务类型调用IService ...
随机推荐
- 【计算几何】【预处理】【枚举】Urozero Autumn Training Camp 2016 Day 5: NWERC-2016 Problem K. Kiwi Trees
发现由于角的度数和边的长度有限制,那俩圆如果放得下的话,必然是塞在两个角里. 于是预处理n个圆心的位置(注意要判断那个圆会不会和其他的边界相交),然后n^2枚举俩角即可. #include<cs ...
- python基础之条件判断和循环
1.条件判断 age = 3 if age >= 18: print('adult') elif age >= 6: print('teenager') else: print('kid' ...
- 2016.4.9 NOI codevs动态规划专练
1.NOI 最大子矩阵 1:最大子矩阵 总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 ...
- 各种GCC
Cross GCC Cygwin GCC Linux GCC MacOSX GCC MinGW GCC Solaris GCC Clang
- tcpreplay工具使用
参考:http://www.cnblogs.com/jiayy/p/3447047.html 速率控制算法的大体思路就是,通过适当的sleep,增加包发送的时间,从而减小算出来的速率,以达到用户设 ...
- php概率算法
这是一个很经典的概率算法函数: function get_rand($proArr) { $result = ''; //概率数组的总概率精度 $proSum = array_sum($proArr) ...
- Ping Pod不通问题定位及Ingress验证
Ping Pod网络问题不通定位记录 1.验证墙是否通 flannel默认使用8285端口作为UDP封装报文的端口,VxLan使用8472端口,下面命令验证一下确定其在8472端口 ip -d lin ...
- ajax常用请求方式
1.JAVA @RequestMapping(value = "testAjax") @ResponseBody public Map<String, Object> ...
- 使用SQL Server 扩展事件来创建死锁的跟踪
我们通过SQL Server 2014图形界面来部署一个扩展事件跟踪会话.然后可以生成SQL脚本. 步骤如下: 步骤1: 通过“对象资源管理器”连接到实例,展开“管理”.“扩展事件”.“会话”. 步骤 ...
- iOS:延时执行的三种方式
延时执行的三种方式:performSelectorXXX方法.GCD中延时函数.创建定时器 第一种方式:NSObject分类当中的方法,延迟一段时间调用某一个方法 @interface NSObj ...