亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 133 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號