我想从 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:“未找到 DeviceEventMessage Arg_ParamName_Name 的签名 IMessageHandler`2 的处理程序”基本上我的理解是我需要注册我定义的消息处理程序,它继承自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
。
- 1 回答
- 0 关注
- 81 浏览
添加回答
举报
0/150
提交
取消