0

我有一个具有多层架构的 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);
    }
}
4

2 回答 2

1

你需要添加类似的东西

scan.AssemblyContainingType<GetUserHandler>();

到您的注册表

于 2017-06-03T17:34:16.977 回答
0

回答 我在 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();
于 2017-06-05T08:13:39.957 回答