我想注册一个从github使用的中介,github提供了一个使用Autofac注册它的示例。
我想我的问题在于这条Autofac线:
builder.RegisterAssemblyTypes(assembly)
.AsClosedTypesOf(typeof(IMessageHandler<,>))
.AsImplementedInterfaces();我不能百分之百确定代码行是做什么的,AsClosedTypesOf要更具体一些。
我试着把它翻译成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<,>) });
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");如果不使用RegisterMany作为IMessageHandler接口,程序将遇到以下错误:
System.ArgumentException:“没有为DeviceEventMessage Arg_ParamName_Name找到签名处理程序IMessageHandler`2‘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")中调用中介,这要求解析处理程序。
如何注册在IMessageHandler<,>中实现DryIoc的类?
发布于 2019-07-22 11:00:41
更新:修正了工作样本
在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的原因是什么。
https://stackoverflow.com/questions/57143947
复制相似问题