.net core 2.0 Autofac
<PackageReference Include="Autofac.Configuration" Version="4.0.1" />
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.2.2" />
 public IContainer ApplicationContainer { get; private set; }
        public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            services.AddSession(a =>
                {
                    a.IdleTimeout = TimeSpan.FromMinutes();
                    a.Cookie.HttpOnly = true;
                });
            services.AddDistributedRedisCache(o => o.Configuration = Configuration.GetConnectionString("Redis"));
            //Add controllers as services so they'll be resolved.
            services.AddMvc().AddControllersAsServices().AddJsonOptions(options => {
                //忽略循环引用
                options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
                //不使用驼峰样式的key
                options.SerializerSettings.ContractResolver = new DefaultContractResolver();
                //设置时间格式
                options.SerializerSettings.DateFormatString = "yyyy-MM-dd";
            });
            return InitIoC(services);
        }
在Startup.cs添加方法
/// <summary>
/// IoC初始化
/// </summary>
/// <param name="services"></param>
/// <returns></returns>
private IServiceProvider InitIoC(IServiceCollection services)
{
IocContainer.Register(Configuration);//注册配置
IocContainer.Register(typeof(BlogContext));//注册EF上下文
IocContainer.Register(Assembly.GetExecutingAssembly());//注册controller
return IocContainer.Build(services);
}
IocContainer自定义类
/// <summary>
/// Autofac Ioc容器
/// </summary>
public class IocContainer
{
private static ContainerBuilder _builder = new ContainerBuilder();
private static IContainer _container;
private static string[] _otherAssembly;
private static List<Type> _types = new List<Type>();
private static Assembly _assName; 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>
/// 注册dal、controller
/// </summary>
/// <param name="ass"></param>
public static void Register(Assembly ass){
_assName = ass;
}
/// <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容器,需在各种Register后调用。
/// </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).InstancePerLifetimeScope();
}
} if (_dicTypes != null)
{
foreach (var dicType in _dicTypes)
{
_builder.RegisterType(dicType.Value).As(dicType.Key);
}
}
_builder.Populate(services);
//you can override the controller registration after populating services.
if(_assName!=null){
_builder.RegisterAssemblyTypes(_assName).Where(t => t.Name.ToLower().EndsWith("dal")).PropertiesAutowired().InstancePerLifetimeScope();
_builder.RegisterAssemblyTypes(_assName).Where(t => t.Name.ToLower().EndsWith("controller")).PropertiesAutowired().InstancePerLifetimeScope();
}
_container = _builder.Build();
return new AutofacServiceProvider(_container);
} /// <summary>
/// Resolve an instance of the default requested type from the container
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <returns></returns>
public static T Resolve<T>()
{
return _container.Resolve<T>();
}
}
.net core 2.0 Autofac的更多相关文章
- NET Core 3.0 AutoFac替换内置DI的新姿势
		
原文:NET Core 3.0 AutoFac替换内置DI的新姿势 .NET Core 3.0 和 以往版本不同,替换AutoFac服务的方式有了一定的变化,在尝试着升级项目的时候出现了一些问题. 原 ...
 - net core 2.0  + Autofac的坑
		
控制器不能从容器中解析出来; 只是控制器构造函数参数.这意味着控制器生命周期,属性注入和其他事情不由Autofac管理 - 它们由ASP.NET Core管理.可以通过指定AddControllers ...
 - NET Core 3.0 新姿势 将AutoFac替换内置DI
		
.NET Core 3.0 和 以往版本不同,替换AutoFac服务的方式有了一定的变化,在尝试着升级项目的时候出现了一些问题. 原来在NET Core 2.1时候,AutoFac返回一个 IServ ...
 - NET Core 3.0 项目中使用 AutoFac
		
.net core 3.1 今天已正式发布,3.1跟3.0差别不是很大,主要是对 3.0一小部分修复和完善,最重要的是.NET Core 3.1是长期支持(LTS)版本,建议大家升级. .net co ...
 - #ASP.NET Core 1.0 Key Features
		
Cross platform support and flexible runtime engine(跨平台支持和灵活的运行时引擎) ASP.NET Core 1.0 offers support f ...
 - .net core web api + Autofac + EFCore 个人实践
		
1.背景 去年时候,写过一篇<Vue2.0 + Element-UI + WebAPI实践:简易个人记账系统>,采用Asp.net Web API + Element-UI.当时主要是为了 ...
 - 从头编写 asp.net core 2.0 web api 基础框架 (3)
		
第一部分:http://www.cnblogs.com/cgzl/p/7637250.html 第二部分:http://www.cnblogs.com/cgzl/p/7640077.html 之前我介 ...
 - asp.net core 2.0+sqlsugar搭建个人网站系列(0)
		
一些废话 马上就要过年了,回顾这一年最大的收获就是技术有了很大的提升,其他的方面没有什么改变,现在还是单身小屌丝一枚. 这一年来学习的主要重点就是asp.net core,中间也使用 core+EF做 ...
 - 【转载】从头编写 asp.net core 2.0 web api 基础框架 (3)
		
Github源码地址:https://github.com/solenovex/Building-asp.net-core-2-web-api-starter-template-from-scratc ...
 
随机推荐
- Docker存储卷(V18.X)
			
简介 介绍 Docker的存储卷称之为volume,本质上容器上的一个或者多个目录,而这些目录绕过了联合文件系统,与宿主机中的目录或者其他容器目录进行了绑定关系,这种绑定关系可以看作Linux的mou ...
 - SQL开窗函数
			
[SQL]四种排序开窗函数 一 .简单了解什么是开窗函数 什么是开窗函数,开窗函数有什么作用,特征是什么? 所谓开窗函数就是定义一个行为列,简单讲,就是在你查询的结果上,直接多出一列值(可以是聚合 ...
 - NuGet的本地服务器安装与Package的发布(呕吐)
			
主要的步骤是按照下面的例子来做的: NuGet学习笔记(1)——初识NuGet及快速安装使用 NuGet学习笔记(2)——使用图形化界面打包自己的类库 NuGet学习笔记(3)——搭建属于自己的NuG ...
 - 面试 15:顺时针从外往里打印数字(剑指 Offer 第 20 题)
			
面试 15:顺时针从外往里打印数字 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印每一个数字.例如输入: {{1,2,3}, {4,5,6}, {7,8,9}} 则依次打印数字为 1.2.3. ...
 - centos安装RabbitMQ 3.7.9 (使用RPM)
			
上篇我们提到不使用RPM安装RabbitMQ 3.7.8,其实我个人更倾向不使用RPM安装RabbitMQ,因为可以控制安装位置及设置参数. 存在即合理,使用RPM安装RabbitMQ,可以减少配置参 ...
 - H5 27-优先级之important
			
27-优先级之important 我是段落 <!DOCTYPE html> <html lang="en"> <head> <meta c ...
 - 第十二届湖南省赛 A - 2016 ( 数学,同余转换)
			
给出正整数 n 和 m,统计满足以下条件的正整数对 (a,b) 的数量: 1. 1≤a≤n,1≤b≤m; 2. a×b 是 2016 的倍数. Input 输入包含不超过 30 ...
 - Echatrs 中PIE饼图中间位置怎么显示总数值?
			
title: { text: '总资产', subtext: '2000000.00', x: 'center', y: 'center' }图例:
 - java总结:double取两位小数的多种方法
			
1.方法一 四舍五入: import java.math.BigDecimal; double f = 111231.5585; BigDecimal b = new BigDecimal(f); d ...
 - css横线中间放图片或者文字
			
效果图: 先贴代码 HTML: <div class="forshow middle"> <div class="flex"></ ...