use*_*369 4 asp.net-mvc dependency-injection autofac mediator
我在用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" };
    }
}
有任何想法吗?
小智 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()方法的参数,应传递程序集,分别在其中定义请求类型和请求处理程序类型。在示例代码中,我假设您已在同一程序集中定义了接口并实现了类型。
| 归档时间: | 
 | 
| 查看次数: | 1332 次 | 
| 最近记录: |