无法自动注册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); 
    } 
} 
+0

这一切在一个组件(项目?) – Alex

+0

@Alex没有,在不同的 –

你需要像

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