簡體   English   中英

將Autofac開放通用接口注冊轉換為DryIoc注冊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM