Autofac注册接口MediatR

5
我遇到了在Autofac中注册IRequest和IRequestHandler接口的问题。以下代码可以正常工作:
var builder = new ContainerBuilder();
builder.RegisterAssemblyTypes(typeof(IMediator).GetTypeInfo().Assembly).AsImplementedInterfaces();
builder.RegisterAssemblyTypes(typeof(Ping).GetTypeInfo().Assembly).AsImplementedInterfaces();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

现在我想让它更加灵活,避免注册所有使用接口的类。
我尝试了这个但没成功:
builder.RegisterGeneric(typeof(IRequest<>)).AsImplementedInterfaces();
builder.RegisterGeneric(typeof(IRequestHandler<,>)).AsImplementedInterfaces();

这是我的 Ping 类:

public class Ping : IRequest<Pong>
{
    public string Message { get; set; }
}

public class Pong
{
    public string Message { get; set; }
}

public class PingHandler : IRequestHandler<Ping, Pong>
{
    public Pong Handle(Ping message)
    {
        return new Pong { Message = message.Message + " Pong" };
    }
}

有什么想法吗?
1个回答

5

RegisterGeneric方法旨在注册开放式泛型类型,但这不是本例的情况。

如果您使用.RegisterAssemblyTypes().AsImplementedInterfaces(),它应该也能处理实现了IRequest<T>IRequestHandler<T1,T2>的类型。但是,如果您想要分别注册请求和请求处理程序类型,可以使用以下代码:

builder
    .RegisterAssemblyTypes(typeof(IRequest<>).Assembly)
    .Where(t => t.IsClosedTypeOf(typeof(IRequest<>)))
    .AsImplementedInterfaces();

builder
    .RegisterAssemblyTypes(typeof(IRequestHandler<>).Assembly)
    .Where(t => t.IsClosedTypeOf(typeof(IRequestHandler<>)))
    .AsImplementedInterfaces();

作为.RegisterAssemblyTypes()方法的参数,您应该传递包含请求类型和请求处理程序类型定义的程序集。在示例代码中,我假设您已经在同一个程序集中定义了接口和实现类型。

由于 IRequest 存在于 MediatR 程序集中,第一个注册方式不会选择任何有趣的内容。此外,您可以将 .Where(t => t.IsClosedTypeOf(typeof(IRequestHandler<>))).AsImplementedInterfaces() 替换为 AsClosedTypesOf(typeof(IRequestHandler<>)) - Mickaël Derriey
在这种情况下,中介服务的范围是什么? - kuldeep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接