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

将 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 关注
  • 81 浏览

添加回答

举报

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