300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)

ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)

时间:2019-03-06 23:00:32

相关推荐

ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)

上一篇 Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)我们讲了如何将默认的容器替换为Autofac,并使用属性注入.那么这一篇我们就来讲讲如何利用Autofac实现我们的AOP(面向切面编程) .

1.引用正确的库来实现AOP

既然是跨平台,那么在 core因为采用了.net core来作为基础库(当然,其实你可以换成.NET4.6.).

新的.NET Core是基于.NET Standard的..所以我们在引用库的时候特别要注意相关的兼容问题.

在传统的中,使用过Autofac来进行AOP操作的,应该都知道这个库.

Autofac.Extras.DynamicProxy

那么我们来看看它的依赖项.如图:

.NET Standard的情况下,他需要Autofac4.0+,这个就不多说了.关键在下面这个,他需要Castle.Core4.0+.

所以,当我们直接安装这个库的时候,Nuget会自动关联并安装最新的Castle.Core4.2.1版本..

那么问题就出现了..在项目的依赖项中,会发现很多警告:

我们进入警告会发现..都是提示缺少兼容的最新的类型转换类.如图:

而且Castle.Core是属于AutoFac下面的..如图:

我们直接通过Nuget查找Castle.Core.

可以发现,它需要ponentModel.TypeConverter4.3..

我们直接安装它,Nuget则会直接帮我们把ponentModel.TypeConverter更新到4.3的版本..

然后重新通过Nuget安装Autofac.Extras.DynamicProxy..就可以了.如图:

其实这应该算一个Nuget的BUG..它会帮你引用库的相关依赖..但是当依赖还有依赖需要更新的时候..它就不会更新..

这个时候我们换一种思维..返回来 一步步引用.就可以了..

2.采用Autofac来实现AOP

首先,我们创建一个拦截类,代码如下:

public class AOPTest : IInterceptor

{

public void Intercept(IInvocation invocation)

{

System.Diagnostics.Debug.WriteLine("你正在调用方法 \"{0}\" 参数是 {1}... ",

invocation.Method.Name,

string.Join(", ", invocation.Arguments.Select(a => (a ?? "").ToString()).ToArray()));

//在被拦截的方法执行完毕后 继续执行

invocation.Proceed();

System.Diagnostics.Debug.WriteLine("方法执行完毕,返回结果:{0}", invocation.ReturnValue);

}

}

这里,需要继承IInterceptor,然后实现它的Intercept方法..我们直接将拦截内容输出到调试窗(正式项目..请根据业务来操作拦截)..

找到我们要拦截的服务.并设置拦截特性(有多种方式.用特性的方式作为例子..个人也觉得特性AOP拦截比较方便),代码如下:

[Intercept(typeof(AOPTest))]

public class TestService: ITestService

{

public TestService()

{

MyProperty = Guid.NewGuid();

}

public Guid MyProperty { get; set; }

public List<string> GetList(string a)

{

return new List<string>() { "LiLei", "ZhangSan", "LiSi" };

}

}

然后在容器中注入我们的AOP拦截类,并开启服务的拦截状态.代码如下:

public class DefaultModule : Module

{

protected override void Load(ContainerBuilder builder)

{

builder.Register(c => new AOPTest());

builder.RegisterType<TestService>().As<ITestService>().PropertiesAutowired().EnableInterfaceInterceptors();

}

}

这里注意,一定要在你注入的服务后面加上EnableInterfaceInterceptors来开启你的拦截.

然后在控制器中调用服务的方法,代码如下:

public class AutoDIController : Controller

{

public ITestService _testService { get; set; }

// GET: AutoDI

public ActionResult Index()

{

ViewBag.date = _testService.GetList("Name");

return View();

}

}

然后我们运行代码.

效果如下:

这样,我们就完成了使用Autofac进行AOP拦截..

Autofac的AOP拦截器还有很多功能与用法.我这里就不一一举例了..请参考官网:/en/latest/advanced/interceptors.html

相关文章:

Core中使用IOC三部曲(一.使用 Core自带的IOC容器)

Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)

AspectCore中的IoC容器和依赖注入

DIP原则、IoC以及DI

全面理解 Core 依赖注入

依赖注入和控制反转

Core 2.0 依赖注入

AspectCore中的IoC容器和依赖注入

Core依赖注入解读&使用Autofac替代实现

拥抱.NET Core系列:依赖注入(1)

拥抱.NET Core系列:依赖注入(2)

学习 Core,你必须了解无处不在的“依赖注入”

原文地址:/GuZhenYin/p/8301500.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。