[英]Convert Autofac Open Generic Interface Registration to DryIoc Registration
我要注册从GitHub,它提供了使用介林样品用于使用Autofac注册它。
我认为我的问题出在这条Autofac产品线上:
builder.RegisterAssemblyTypes(assembly)
.AsClosedTypesOf(typeof(IMessageHandler<,>))
.AsImplementedInterfaces();
我不确定100%的代码行做什么, AsClosedTypesOf
更具体。
我试图将其翻译为DryIoc为:
container.RegisterMany(
new Type[] { typeof(IMessageHandler<,>) },
serviceTypeCondition: s => s.IsInterface,
setup: Setup.With(openResolutionScope: true));
但是我收到以下错误:
DryIoc.ContainerException:'在具体时注册抽象实现类型SimpleMediator.Core.IMessageHandler <,>。 也没有工厂方法代替。
到目前为止,这是我的注册码:
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");
在不为IMessageHandler接口使用RegisterMany的情况下,程序遇到错误:
System.ArgumentException:'未找到DeviceEventMessage Arg_ParamName_Name签名IMessageHandler`2的处理程序'
基本上,我了解的是我需要注册已定义的消息处理程序,该消息处理程序继承自IMessageHandler<,>
中介者将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")
调用中介程序的地方,这需要解析处理程序。
如何在DryIoc中注册实现IMessageHandler<,>
的类 ?
在serviceTypeCondition
添加了s.GetGenericDefinitionOrNull()
异常恰好与这里的问题有关:
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
的原因是什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.