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

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

將 Autofac 開放通用接口注冊轉換為 DryIoc 注冊

將 Autofac 開放通用接口注冊轉換為 DryIoc 注冊

C#
ibeautiful 2023-07-09 15:24:05
我想從 github 注冊一個正在使用的中介器,它提供了使用 Autofac 注冊它的示例。我認為我的問題在于這條 Autofac 線:builder.RegisterAssemblyTypes(assembly) ????.AsClosedTypesOf(typeof(IMessageHandler<,>)) ????.AsImplementedInterfaces();AsClosedTypesOf更具體地說,我不是 100% 確定這行代碼的作用。我嘗試將其翻譯為 DryIoc:container.RegisterMany(? ???new?Type[]?{?typeof(IMessageHandler<,>)?}, ????serviceTypeCondition:?s?=>?s.IsInterface,? ????setup:?Setup.With(openResolutionScope:?true));但我收到以下錯誤:DryIoc.ContainerException: '注冊抽象實現類型 SimpleMediator.Core.IMessageHandler<,> 時應該是具體的。而且也沒有 FactoryMethod 可以替代。這是我到目前為止的注冊碼:? ? container.RegisterMany(? ? ? ? ? ? new Type[] { typeof(IMessageHandler<,>) },? ? ? ? ? ? serviceTypeCondition: s => s.IsInterface,?? ? ? ? ? ? setup: Setup.With(openResolutionScope: true));? ? ? ? //var assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(a => !a.IsDynamic);? ? ? ? container.RegisterDelegate<ServiceFactoryDelegate>(c => t =>? ? ? ? {? ? ? ? ? ? return c.Resolve(t);? ? ? ? });? ? ? ? container.RegisterMany<ServiceFactory>();? ? ? ? container.RegisterMany<Mediator>();? ? ? ? container.RegisterMany(new Type[] { typeof(MessageProcessor<,>) });如果不使用 RegisterMany 作為 IMessageHandler 接口,程序會遇到錯誤:System.ArgumentException:&ldquo;未找到 DeviceEventMessage Arg_ParamName_Name 的簽名 IMessageHandler`2 的處理程序&rdquo;基本上我的理解是我需要注冊我定義的消息處理程序,它繼承自IMessageHandler<,>Mediator 定義 IMessageHandler 如下:public?interface?IEventHandler<in?TEvent> ????:?IMessageHandler<TEvent,?Unit>?where?TEvent?:?IMessage<Unit> { }我在服務中實現它:public?class?Service2?:?IService2,?IEventHandler<DeviceEventMessage> {????public?async?Task<Unit>?HandleAsync( ????????DeviceEventMessage?message, ????????IMediationContext?mediationContext, ????????CancellationToken?cancellationToken) ????{? ???????????return?Unit.Result; ????} }其中 service1 實際上調用了GetDevice("asdf")需要解析處理程序的中介器。我如何注冊IMessageHandler<,>在DryIoc中實現的類?
查看完整描述

1 回答

?
互換的青春

TA貢獻1797條經驗 獲得超6個贊

更新:修復了工作示例

添加s.GetGenericDefinitionOrNull()serviceTypeCondition

回答

例外正是關于這里的問題:

container.RegisterMany(
    new Type[] { typeof(IMessageHandler<,>) },
    serviceTypeCondition: s => s.IsInterface,
    setup: Setup.With(openResolutionScope: true));

RegisterMany重載期望第一個參數是具體實現類型的集合。

對于你的情況,你可能需要這樣的東西:

container.RegisterMany(
    new[] { typeof(Service1).GetAssembly() },
    serviceTypeCondition: s => s.GetGenericDefinitionOrNull() == typeof(IMessageHandler<,>));

順便說一句,不知道是什么原因openResolutionScope: true。


查看完整回答
反對 回復 2023-07-09
  • 1 回答
  • 0 關注
  • 176 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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