聊一聊为什么我要整合Microsoft.Extensions.DependencyInjection和Castle.Core.docx

聊一聊为什么我要整合Microsoft.Extensions.DependencyInjection和Castle.Core.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

聊一聊为什么我要整合Microsoft.Extensions.DependencyInjection和Castle.Core

如果用到动态代理,大家可能会有几种选择,排到前列的是Autofac+Castle、AspectCore和DorAInterception,

我将从我当时研究的经历,以及我遇到的场景,为大家展示下

聊一聊我为什么要费时费力的整合Microsoft.Extensions.DependencyInjection和Castle.Core

当时遇到的场景

直接上源码

publicinterfaceIEventHandler

TaskboolHandleAsync(IEvent@event);

boolCanHandle(IEvent@event);

publicinterfaceIEventHandlerT:IEventHandler

whereT:class,IEvent

TaskboolHandleAsync(T@event);

boolIEventHandler.CanHandle(IEvent@event)=@event.GetType()==typeof(T);//语言特性:默认实现2025-1-1510:23:10

TaskboolIEventHandler.HandleAsync(IEvent@event)=CanHandle((T)@event)//语言特性:默认实现2025-1-1510:23:10

HandleAsync((T)@event)

:Task.FromResult(false);

publicinterfaceIEvent

publiclongId{get;set;}

publicDateTimeOccurredOn{get;set;}

如上所示的接口定义了一个事件处理接口,其中HandleAsync方法是事件处理的入口,CanHandle方法用于判断事件是否可以处理,在程序解耦、异步、削峰填谷等场景中,如上的接口可以有很多的应用,也可以扩展到内存级别、RabbitMQ、Redis、Kafka、RocketMQ等中间件的适配的事件处理器,以提供更强大的性能和更丰富的应用场景。所以说这是一个比较通用的场景。

我们将为该处理器提供一个检查幂等的拦截器(Idempotent)

AspectCore

事件定义如下

publicclassCatchLoggingOccurredEvent:IEvent

protectedCatchLoggingOccurredEvent()

OccurredOn=DateTime.Now;

publicCatchLoggingOccurredEvent(longid)

:this()

Id=id;

publiclongId{get;set;}

publicDateTimeOccurredOn{get;set;}

事件处理器及Aspecore定义的特性

///summary

////summary

publicclassCatchLoggingOccurredEventHandler

:IEventHandlerCatchLoggingOccurredEvent

[Idempotent]

publicasyncvirtualTaskboolHandleAsync(CatchLoggingOccurredEvent@event)

awaitConsole.Out.WriteLineAsync(${nameof(CatchLoggingOccurredEventHandler)}处理事件:\t事件【{@event.Id}】@@@@@@发生于【{@event.OccurredOn}】

returntrue;

[AttributeUsage(AttributeTargets.Method,AllowMultiple=false,Inherited=false)]

internalclassIdempotentAttribute

:AbstractInterceptorAttribute

publicoverrideasyncTaskInvoke(AspectContextcontext,AspectDelegatenext

文档评论(0)

158****9170 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档