我有一个带有多层体系结构的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);
}
}
答案 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();