无法自动注册Mediatr结构图IoC
问题描述:
我有一个多层体系结构的Web应用程序和处理程序和查询类在结构图配置的单独层中。我试图动态注册的所有处理和查询,但我couldn't.When我尝试运行我收到运行时错误应用程序:无法自动注册Mediatr结构图IoC
没有默认实例注册,并且不能为类型“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);
}
}
答
你需要像
scan.AssemblyContainingType<GetUserHandler>();
讲一下你的注册表
答
ANSWER 我已经添加到扫描方法几个命令从扫描其他项目解决方案,之后,我调用方法LookForRegistries。如果您希望在其他项目中使用扫描类型和实现,则需要设置扫描方法中扫描特定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();
+0
你可以使用AssemblyContainingType,按我的答案 – Alex
这一切在一个组件(项目?) – Alex
@Alex没有,在不同的 –