首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Autofac开放通用接口注册转换为DryIoc注册

将Autofac开放通用接口注册转换为DryIoc注册
EN

Stack Overflow用户
提问于 2019-07-22 10:24:12
回答 1查看 520关注 0票数 0

我想注册一个从github使用的中介,github提供了一个使用Autofac注册它的示例

我想我的问题在于这条Autofac线:

代码语言:javascript
复制
builder.RegisterAssemblyTypes(assembly)
    .AsClosedTypesOf(typeof(IMessageHandler<,>))
    .AsImplementedInterfaces();

我不能百分之百确定代码行是做什么的,AsClosedTypesOf要更具体一些。

我试着把它翻译成DryIoc:

代码语言:javascript
复制
container.RegisterMany(
    new Type[] { typeof(IMessageHandler<,>) },
    serviceTypeCondition: s => s.IsInterface, 
    setup: Setup.With(openResolutionScope: true));

但我得到了以下错误:

DryIoc.ContainerException:‘注册抽象实现类型SimpleMediator.Core.IMessageHandler<,>当它应该是具体的,并且没有FactoryMethod代替使用。

到目前为止,这是我的注册码:

代码语言:javascript
复制
        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定义为:

代码语言:javascript
复制
public interface IEventHandler<in TEvent>
    : IMessageHandler<TEvent, Unit> where TEvent : IMessage<Unit>
{
}

我在服务中实现了它:

代码语言:javascript
复制
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的类?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-22 11:00:41

更新:修正了工作样本

s.GetGenericDefinitionOrNull()中添加serviceTypeCondition

回答

例外就是这里的问题:

代码语言:javascript
复制
container.RegisterMany(
    new Type[] { typeof(IMessageHandler<,>) },
    serviceTypeCondition: s => s.IsInterface,
    setup: Setup.With(openResolutionScope: true));

这个RegisterMany重载期望第一个参数是具体实现类型的集合。

就您的情况而言,您可能需要这样的东西:

代码语言:javascript
复制
container.RegisterMany(
    new[] { typeof(Service1).GetAssembly() },
    serviceTypeCondition: s => s.GetGenericDefinitionOrNull() == typeof(IMessageHandler<,>));

顺便说一句,不知道openResolutionScope: true的原因是什么。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57143947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档