无法通过结构图IoC自动注册Mediatr

时间:2017-06-02 20:03:41

标签: asp.net-mvc structuremap cqrs mediatr multi-layer

我有一个带有多层体系结构的Web应用程序,以及与结构图配置分离的层中的处理程序和查询类。我试图动态注册所有处理程序和查询,但我不能。当我尝试运行应用程序时,我收到运行时错误:

没有注册默认实例,无法自动确定类型'IRequestHandler' 没有为IRequestHandler指定配置

        public DefaultRegistry() {
        Scan(
            scan => {
                scan.TheCallingAssembly();
                scan.WithDefaultConventions();
                scan.AssemblyContainingType<DefaultRegistry>();
                scan.AssemblyContainingType<IMediator>();
                scan.ConnectImplementationsToTypesClosing(typeof(IRequestHandler<,>));
                scan.ConnectImplementationsToTypesClosing(typeof(IAsyncRequestHandler<,>));
                scan.ConnectImplementationsToTypesClosing(typeof(IRequestHandler<>));
                scan.ConnectImplementationsToTypesClosing(typeof(IAsyncRequestHandler<>));
                scan.ConnectImplementationsToTypesClosing(typeof(INotificationHandler<>));
                scan.ConnectImplementationsToTypesClosing(typeof(IAsyncNotificationHandler<>));
                scan.ConnectImplementationsToTypesClosing(typeof(IRepository<>));
                scan.With(new ControllerConvention());
            });
        //For<IExample>().Use<Example
        For<SingleInstanceFactory>().Use<SingleInstanceFactory>(ctx => t => ctx.GetInstance(t));
        For<MultiInstanceFactory>().Use<MultiInstanceFactory>(ctx => t => ctx.GetAllInstances(t));
        For<IMediator>().Use<Mediator>();
        For<IUnitOfWork>().Use<UnitOfWork>().LifecycleIs<TransientLifecycle>();
        For(typeof(IRequestHandler<,>)).DecorateAllWith(typeof(Business.Pipeline.MediatorPipeline<,>));
    }

控制器 var query = new GetUserQuery(id);var user = _mediator.Send(query);

查询

    public class GetUserQuery : IRequest<User>
{
    public GetUserQuery() { }
    public GetUserQuery(int id)
    {
        Id = id;
    }

    public int Id { get; set; }
}

处理程序

 public class GetUserHandler : IRequestHandler<GetUserQuery, User>
{
    private readonly IUnitOfWork _uow;
    public GetUserHandler(IUnitOfWork uow)
    {
        _uow = uow;
    }

    public User Handle(GetUserQuery message)
    {
        return _uow.UserRepository.Get(message.Id);
    }
}

2 个答案:

答案 0 :(得分:1)

您需要添加类似

的内容
scan.AssemblyContainingType<GetUserHandler>();

到您的注册表

答案 1 :(得分:0)

<强> ANSWER 我已经向Scan方法添加了一些用于从解决方案中扫描其他项目的命令,之后,我调用了方法LookForRegistries。如果您想在其他项目中使用扫描类型和实现,则需要在Scan方法中设置扫描特定dll的规则。

                    scan.Assembly("NameOfProj.Business");
                scan.Assembly("NameOfProj.Persistence");
                scan.TheCallingAssembly();
                scan.AssemblyContainingType<DefaultRegistry>();
                scan.ConnectImplementationsToTypesClosing(typeof(IRequestHandler<,>));
                scan.ConnectImplementationsToTypesClosing(typeof(IAsyncRequestHandler<,>));
                scan.ConnectImplementationsToTypesClosing(typeof(IRequestHandler<>));
                scan.ConnectImplementationsToTypesClosing(typeof(IAsyncRequestHandler<>));
                scan.ConnectImplementationsToTypesClosing(typeof(INotificationHandler<>));
                scan.ConnectImplementationsToTypesClosing(typeof(IAsyncNotificationHandler<>));
                scan.ConnectImplementationsToTypesClosing(typeof(IRepository<>));
                scan.LookForRegistries();
                scan.WithDefaultConventions();