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

C# 将Autofac开放式通用接口注册转换为DryIoc注册,c#,dependency-injection,autofac,dryioc,C#,Dependency Injection,Autofac,Dryioc,我想从github注册一个Im使用的中介,它提供了一个使用Autofac注册它的方法 我认为我的问题在于这条Autofac生产线: builder.RegisterAssemblyTypes(assembly) .AsClosedTypesOf(typeof(IMessageHandler<,>)) .AsImplementedInterfaces(); 但我得到了以下错误: DryIoc.ContainerException:'正在注册抽象实现类型 SimpleM

我想从github注册一个Im使用的中介,它提供了一个使用Autofac注册它的方法

我认为我的问题在于这条Autofac生产线:

builder.RegisterAssemblyTypes(assembly)
    .AsClosedTypesOf(typeof(IMessageHandler<,>))
    .AsImplementedInterfaces();
但我得到了以下错误:

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<,>) });

        container.Register<IService1, Service1>(Reuse.Singleton);
        container.Register<IService2, Service2>(Reuse.Singleton);

        var service1 = container.Resolve<IService1>();
        var service2 = container.Resolve<IService2>();

        service1.GetDevice("asdf");
container.RegisterMany(
新类型[]{typeof(IMessageHandler)},
serviceTypeCondition:s=>s.IsInterface,
setup:setup.With(openResolutionScope:true));
//var assemblies=AppDomain.CurrentDomain.GetAssemblys()。其中(a=>!a.IsDynamic);
container.RegisterDelegate(c=>t=>
{
返回c.Resolve(t);
});
container.RegisterMany();
container.RegisterMany();
RegisterMany(新类型[]{typeof(MessageProcessor)});
容器.寄存器(重用.单例);
容器.寄存器(重用.单例);
var service1=container.Resolve();
var service2=container.Resolve();
服务1.获取设备(“asdf”);
如果不对IMessageHandler接口使用RegisterMany,程序将遇到以下错误:

System.ArgumentException:'没有签名IMessageHandler'2的处理程序 已为DeviceEventMessage Arg_ParamName_Name'找到

基本上,我的理解是,我需要注册我定义的消息处理程序,它们继承自
IMessageHandler

Mediator将IMessageHandler定义为:

public interface IEventHandler<in TEvent>
    : IMessageHandler<TEvent, Unit> where TEvent : IMessage<Unit>
{
}
公共接口IEventHandler
:IMessageHandler,其中TEvent:IMessage
{
}
我在服务中实现它:

public class Service2 : IService2, IEventHandler<DeviceEventMessage>
{
    public async Task<Unit> HandleAsync(
        DeviceEventMessage message,
        IMediationContext mediationContext,
        CancellationToken cancellationToken)
    {
        return Unit.Result;
    }
}
公共类服务2:IService2,IEventHandler
{
公共异步任务HandleAsync(
DeviceEventMessage消息,
IMediationContext中介上下文,
取消令牌(取消令牌)
{
返回单位。结果;
}
}
其中service1实际调用了
GetDevice(“asdf”)
中的中介,这需要解析处理程序

如何在DryIoc中注册实现
IMessageHandler
的类?

更新:修复了工作示例 在
serviceTypeCondition

答复 例外情况正是关于这里的问题:

container.RegisterMany(
新类型[]{typeof(IMessageHandler)},
serviceTypeCondition:s=>s.IsInterface,
setup:setup.With(openResolutionScope:true));
这个
RegisterMany
重载要求第一个参数是具体实现类型的集合

对于您的情况,您可能需要这样的内容:

container.RegisterMany(
新[]{typeof(Service1.GetAssembly()},
serviceTypeCondition:s=>s.GetGenericDefinitionOrNull()==typeof(IMessageHandler));
顺便说一句,不确定是什么原因导致了
openResolutionScope:true

更新:修复了工作样本 在
serviceTypeCondition

答复 例外情况正是关于这里的问题:

container.RegisterMany(
新类型[]{typeof(IMessageHandler)},
serviceTypeCondition:s=>s.IsInterface,
setup:setup.With(openResolutionScope:true));
这个
RegisterMany
重载要求第一个参数是具体实现类型的集合

对于您的情况,您可能需要这样的内容:

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

顺便说一句,我不知道为什么要使用openResolutionScope:true

顺便说一句,你现在知道DryIoc.Messages名称空间了吗?还有一个DryIoc.Syntax.Autofac.dll包:@dadhi我不知道Messages名称空间,不熟悉使用中介,所以从学习的角度尝试使用中介。我可能会把它放在DryIoc上。顺便说一句,你现在知道DryIoc.Messages名称空间了吗?还有一个DryIoc.Syntax.Autofac.dll包:@dadhi我不知道Messages名称空间,对使用中介和服务还不熟悉,所以从学习的角度尝试使用中介。我不记得为什么我加了openResolutionScope:是的,我匆忙地写了出来。将行更改为这一行和新的我已经修复了示例-检查更新和工作示例。以下是供参考的实时代码示例:不记得我为什么添加openResolutionScope:true,匆忙编写。将行更改为这一行和新的我已经修复了示例-检查更新和工作示例。以下是供参考的实时代码示例:
public class Service2 : IService2, IEventHandler<DeviceEventMessage>
{
    public async Task<Unit> HandleAsync(
        DeviceEventMessage message,
        IMediationContext mediationContext,
        CancellationToken cancellationToken)
    {
        return Unit.Result;
    }
}