猿问

将 Autofac 开放通用接口注册转换为 DryIoc 注册

我想从 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中实现的类?


ibeautiful
浏览 202回答 1
1回答

互换的青春

更新:修复了工作示例添加s.GetGenericDefinitionOrNull()于serviceTypeCondition回答例外正是关于这里的问题:container.RegisterMany( &nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Type[]&nbsp;{&nbsp;typeof(IMessageHandler<,>)&nbsp;}, &nbsp;&nbsp;&nbsp;&nbsp;serviceTypeCondition:&nbsp;s&nbsp;=>&nbsp;s.IsInterface, &nbsp;&nbsp;&nbsp;&nbsp;setup:&nbsp;Setup.With(openResolutionScope:&nbsp;true));此RegisterMany重载期望第一个参数是具体实现类型的集合。对于你的情况,你可能需要这样的东西:container.RegisterMany( &nbsp;&nbsp;&nbsp;&nbsp;new[]&nbsp;{&nbsp;typeof(Service1).GetAssembly()&nbsp;}, &nbsp;&nbsp;&nbsp;&nbsp;serviceTypeCondition:&nbsp;s&nbsp;=>&nbsp;s.GetGenericDefinitionOrNull()&nbsp;==&nbsp;typeof(IMessageHandler<,>));顺便说一句,不知道是什么原因openResolutionScope: true。
随时随地看视频慕课网APP
我要回答