C# 将Autofac开放式通用接口注册转换为DryIoc注册
我想从github注册一个Im使用的中介,它提供了一个使用Autofac注册它的方法 我认为我的问题在于这条Autofac生产线: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
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;
}
}