ASP.NET Core 整合Autofac和Castle实现自动AOP拦截
前言:
除了ASP.NETCore自帶的IOC容器外,我們還可以使用其他成熟的DI框架,如Autofac,StructureMap等(筆者只用過(guò)Unity,Ninject和Castle)。
1.ASP.NET Core中的Autofac
首先在Project.json的Dependency節(jié)點(diǎn)為中添加如下引用:
"Microsoft.Extensions.DependencyInjection": "1.0.0",
"Autofac": "4.1.1",
"Autofac.Extensions.DependencyInjection": "4.0.0",
接著我們也修改Startup文件中的ConfigureServices方法,為了接管默認(rèn)的DI,我們要為函數(shù)添加返回值AutofacServiceProvider;
1.1 ConfigureServices函數(shù)
public IServiceProvider ConfigureServices(IServiceCollection services)
{
? ? services.AddApplicationInsightsTelemetry(Configuration);
? ? services.AddMvc();
? ? return RegisterAutofac(services);
}
1.2 RegisterAutofac函數(shù)
private IServiceProvider RegisterAutofac(IServiceCollection services)
{
? ? var builder = new ContainerBuilder();
? ? builder.Populate(services);
? ? var assembly = this.GetType().GetTypeInfo().Assembly;
? ? builder.RegisterType<AopInterceptor>();
? ? builder.RegisterAssemblyTypes(assembly)
? ? ? ? ? ? ? ? ?.Where(type =>
? ? ? ? ? ? ? ? ? typeof(IDependency).IsAssignableFrom(type) && !type.GetTypeInfo().IsAbstract)
? ? ? ? ? ? ? ? ?.AsImplementedInterfaces()
? ? ? ? ? ? ? ? ?.InstancePerLifetimeScope().EnableInterfaceInterceptors().InterceptedBy(typeof(AopInterceptor));
? ? ?this.ApplicationContainer = builder.Build();
? ? ?return new AutofacServiceProvider(this.ApplicationContainer);
}
這里IDependency接口是一個(gè)空接口,為了掃描到實(shí)現(xiàn)這個(gè)接口的類,自動(dòng)完成注入操作。
2.整合Castle的DynamicProxy
要實(shí)現(xiàn)整合,只需要上面函數(shù)中,這段代碼:
.EnableInterfaceInterceptors().InterceptedBy(typeof(AopInterceptor));
2.2 引用程序集
顯然些程序集還沒(méi)有Core的對(duì)應(yīng)版本的Autofac.Extras.DynamicProxy,既然說(shuō)好要整合,就修改一下源代碼吧。
Autofac.Extras.DynamicProxy之所以不能支持Core,主要是因?yàn)樵谠创a中沒(méi)有使用新的反射API,GetTypeInfo或使用了一些Remoting的API導(dǎo)致的。
支持Core的Autofac.Extras.DynamicProxy源代碼內(nèi)容和Demo的Github地址如下:
https://github.com/maxzhang1985/AutofacCastle.AspNetCore.Demo
3.注意事項(xiàng)
(1).創(chuàng)建Autofac容器時(shí)不要忘了將ConfigureServices的返回值修改為IServiceProvider。
(2).對(duì)應(yīng)ASP.NET Core提及的不同的生命周期,Autofac也定義了對(duì)應(yīng)的擴(kuò)展方法,如InstancePerLifetimeScope等,默認(rèn)為Transient模式,包括EntityFramwork等Context也是該種模式。
(3).Autofac Core不支持從View中注入,但是可以和ASP.NET Core自帶IOC容器配合使用。
原文地址:http://www.cnblogs.com/maxzhang1985/p/5919936.html
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺(tái)或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的ASP.NET Core 整合Autofac和Castle实现自动AOP拦截的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 微软全球副总裁给你发了一张Connect
- 下一篇: 我为什么选择Angular 2?