Is this you? As a journalist, you can create a free Muck Rack account to customize your profile, list your contact preferences, and upload a portfolio of your best work.
Claim your profile
Articles by ITransient Dependency
将Abp默认事件总线改造为分布式事件总线 - 林晓lx - 博客园
@ 本地事件总线是通过Ioc容器来实现的。 IEventBus接口定义了事件总线的基本功能,如注册事件、取消注册事件、触发事件等。 Abp.Events.Bus.EventBus是本地事件总线的实现类,其中私有成员ConcurrentDictionary<Type, List<IEventHandlerFactory>> _handlerFactories是事件订阅表。通过维护事件订阅表来实现事件处理器的注册和取消注册。当对应类型的事件触发时,通过订阅表查找所有事件处理器,通过Ioc容器来获取处理器实例,然后通过反射来调用事件处理器的"HandleEvent"方法。 创建分布式事件总线 首先,我们需要一个分布式事件总线中间件,用来将事件从本地事件总线转发到分布式事件总线。常用的中间件有RabbitMQ、Kafka、Redis等。 开源社区已经有实现好的库,本项目参考了 wuyi6216/Abp.RemoteEventBus 这里已经定义好了一个分布式事件总线接口 public interface IDistributedEventBus : IDisposable { void...
Util应用框架基础(一) - 依赖注入
本节介绍Util应用框架依赖注入的使用和配置扩展. 文章分为多个小节,如果对设计原理不感兴趣,只需阅读基础用法部分即可. 概述 当你想调用某个服务的方法完成特定功能时,首先需要得到这个服务的实例. 最简单的办法是直接 new 一个服务实例,不过这样就把服务的实现牢牢绑死了,当你需要更换实现,除了直接修改它没有别的办法. 依赖注入是一种获取服务实例更好的方法. 通常需要先定义服务接口,然后在你的构造方法声明这些接口参数. 服务实例不是你创建的,而是从外部传入的. 你只跟服务接口打交道,所以不会被具体的实现类绑死. 现在每个服务都在自己的构造方法定义参数接收依赖项,但是最终必须在某处真正创建这些服务实例. 使用new手工创建服务实例是不可行的,因为存在依赖链,比如使用 new A() 创建服务A的实例时,服务A可能依赖服务B,需要先创建服务B的实例,而服务B可能还有依赖. 另外,某些服务可能需要特定的生命周期,比如工作单元服务,在单个请求过程,每次注入的工作单元实例必须是同一个. 我们需要一种机制,能够自动创建具有依赖的服务实例,并管理实例的生命周期. Asp.Net Core 内置了构造方法依赖注入能力.
造轮子之EventBus - 饭勺oO - 博客园
前面基础管理的功能基本开发完了,接下来我们来优化一下开发功能,来添加EventBus功能。 EventBus也是我们使用场景非常广的东西。这里我会实现一个本地的EventBus以及分布式的EventBus。 分别使用MediatR和Cap来实现。 现在简单介绍一下这两者: MediatR是一个轻量级的中介者库,用于实现应用程序内部的消息传递和处理。它提供了一种简单而强大的方式来解耦应用程序的不同部分,并促进了代码的可维护性和可测试性。使用MediatR,您可以定义请求和处理程序,然后通过发送请求来触发相应的处理程序。这种模式使得应用程序的不同组件可以通过消息进行通信,而不需要直接引用彼此的代码。MediatR还提供了管道处理功能,可以在请求到达处理程序之前或之后执行一些逻辑,例如验证、日志记录或缓存。...
造轮子之自定义授权策略 - 饭勺oO - 博客园
前面我们已经弄好了用户角色这块内容,接下来就是我们的授权策略。在asp.net core中提供了自定义的授权策略方案,我们可以按照需求自定义我们的权限过滤。 这里我的想法是,不需要在每个Controller或者Action打上AuthorizeAttribute,自动根据ControllerName和ActionName匹配授权。只需要在Controller基类打上一个AuthorizeAttribute,其他Controller除了需要匿名访问的,使用统一的ControllerName和ActionName匹配授权方案。 话不多说,开整。 IPermissionChecker 首先我们需要一个PermissionChecker来作为检查当前操作是否有权限。很简单,只需要传入ControllerName和ActionName。至于实现,后续再写。 namespace Wheel.Authorization { public interface IPermissionChecker { Task<bool> Check(string controller, string...
扩展ABP的Webhook功能,推送数据到第三方接口(企业微信群、钉钉群等) - freed - 博客园
ASP.NET Boilerplate(以下简称ABP)在v5.2(2020-02-18)版本中发布了Webhook功能,详细说明,请参见:官方帮助链接; ASP.NET ZERO(以下简称ZERO)在v8.2.0(2020-02-20)版本中发布了Webhook功能; 我们系统是在2021年4月完成了对Webhook功能的改造:内部接口(用户自行设定接口地址的)、第三方接口(微信内部群、钉钉群、聚水潭API等)。 为了区分内部接口与第三方接口,在第三方接口名称前统一附加特定前缀,如:Third.WX.XXX、Third.DD.XXX等; 添加定义条目时候设定对应的特性(featureDependency),基于特性功能对不同租户显示或者隐藏定义的条目。 public class AppWebhookDefinitionProvider : WebhookDefinitionProvider { public override void SetWebhooks(IWebhookDefinitionContext context) { //物料档案 - 全部可见...
怎样优雅地增删查改(三):业务用户的增删查改 - 林晓lx - 博客园
@ 创建业务用户 区别于身份管理模块(Identity模块)的鉴权用户IdentityUser,业务用户(BusinessUser)是围绕业务系统中“用户”这一定义的领域模型。如:在一个医院系统中,业务用户可以是医生、护士、患者;在一个OA系统中,业务用户可以是员工、管理员、客户等。 业务用户和鉴权用户由同步机制关联,业务用户通过分布式事件(DistributedEvent)的同步器(Synchronizer)与鉴权用户关联同步。 在Health业务模块中,定义两种业务用户: Client: 客户; Employee: 员工。 这些业务用户继承自HealthUser,HealthUser是业务用户的基类,包含了业务用户的基本信息,如姓名,性别,出生日期,身份证号等。并且需要实现IUpdateUserData接口,以便在同步鉴权用户信息时,更新业务用户的基本信息。 Employee包含工号,职称,简介等信息。其领域模型定义如下: public class Employee : HealthUser<Guid>, IUser, IUpdateUserData {...
ABP - 本地事件总线 - 啊晚 - 博客园
在我们的一个应用中,经常会出现一个逻辑执行之后要跟随执行另一个逻辑的情况,例如一个用户创建了后续还需要发送邮件进行通知,或者需要初始化相应的权限等。面对这样的情况,我们当然可以顺序进行相应的逻辑代码的编写,但这样会导致各种业务逻辑全部集中耦合在一个类中,违背了 "单一职责原则"。 在 ABP 框架中,对于上面的业务场景的处理,我们可以通过事件总线来解耦,使得代码逻辑实现更加清晰。事件总线的本质就是中介者模式,利用一个中介角色在发送方和接受方之间进行消息的传递,接受方单独实现关注的独立的小功能点,从而达到各块业务逻辑清晰,代码松散耦合的目的。 ABP 框架中的事件总线分为 本地事件总线 和 分布式事件总线 两种,两种使用的方式基本类似,只是分布式事件总线需要借助 RabbitMQ、Kafaka 等第三方消息队列中间件。本章先讲本地事件总线相关知识点。 本地事件总线实现进程内的事件的发布订阅功能,通常运用于单体应用架构或微服务架构中的一个服务内部。使用方式比较简单,以下是演示,也将通过控制台程序来进行。 本地事件总线的实现包含在 Volo.Abp.EventBus Nuget...
ABP - 依赖注入(1) - 啊晚 - 博客园
手动注册依赖注入关系 与Asp.Net Core在Startup类中的ConfigureServices()方法中,通过IServiceCollection向容器中添加依赖注入关系没有区别,在Abp框架中也完成兼容这种方式。 不过这些依赖关系的配置一般会在各自的模块中配置,而不是全部都写在Startup类中,这样使得各个模块之间更加独立,开箱即用。 [DependsOn(typeof(AbpAspNetCoreModule))] [DependsOn(typeof(SuncereAbpDataModule))] public class SuncereAbpFreeSqlModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { context.Services.AddFreeSql(); } }...
Show More
loading
Actions
Is this you?
As a journalist, you can create a free Muck Rack account to customize your profile, list your contact preferences, and upload a portfolio of your best work.Get in touch with ITransient
Contact ITransient, search articles and posts on X, monitor coverage, and track replies from one place.
Learn more about Muck Rack