为了账号安全,请及时绑定邮箱和手机立即绑定

Autofac如何在运行时注册和解析通用接口?

Autofac如何在运行时注册和解析通用接口?

PHP
阿波罗的战车 2024-01-20 15:38:15
我在运行时解析通用接口实现时遇到问题。我正在使用一个事件总线,它将根据事件的类型解析事件处理程序。当我尝试在没有通用实现的情况下解决事件处理程序时,一切都会按预期进行。我想实现一个通用接口,这样我就可以有一个处理特定类型事件的基类。在创建通用实现之前,我遇到过以下情况:public interface IEvent    {        Guid EntityId { get; set; }    }public interface IEventHandler<TEvent> where TEvent : IEvent    {        Task Handle(TEvent @event);    }public class EventBus    {        private readonly IComponentContext _context;        public EventBus(IComponentContext context)        {            _context = context;        }        public async Task HandleEvent<TEvent>(TEvent @event) where TEvent : IEvent        {            var handler = _context.Resolve<IEventHandler<TEvent>>();            await handler.Handle(@event);        }    }我按如下方式注册事件处理程序:builder.RegisterAssemblyTypes(ThisAssembly).AsClosedTypesOf(typeof(IEventHandler<>));实施示例:public class FooEventHandler :        IEventHandler<FooArchivedEvent>,        IEventHandler<FooRestoredEvent>,        IEventHandler<FooSomethingElseHappenedEvent>    {        private readonly IRepository<Foo> _repository;        public FooEventHandler(IRepository<Foo> repository)        {            _repository = repository;        }        public async Task Handle(FooArchivedEvent @event)        {            var Foo = await _repository.Get(@event.EntityId);            Foo.Archive();        }        public async Task Handle(FooRestoredEvent @event)        {            var Foo = await _repository.Get(@event.EntityId);            Foo.Restore();        }        public async Task Handle(FooSomethingElseHappenedEvent @event)        {            // do something else with Foo        }    }
查看完整描述

1 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

我最终编写了一个方法来检查已注册处理程序的类型的每个接口:


private IEventHandler<TEvent> GetHandler<TEvent>(Type type = null) where TEvent : IEvent

        {

            object handler;

            type = type ?? typeof(TEvent);

            if (_container.TryResolve(typeof(IEventHandler<>).MakeGenericType(type), out handler))

            {

                return (IEventHandler<TEvent>)handler;

            }

            else

            {

                foreach (var t in type.GetInterfaces())

                {

                    var h = GetHandler<TEvent>(t);

                    if (h != null)

                        return h;

                }

            }

            return null;

        }


查看完整回答
反对 回复 2024-01-20
  • 1 回答
  • 0 关注
  • 68 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信