2017-06-02 5 views
0

J'ai une application Web avec une architecture multicouche et les classes de gestionnaires et de requêtes dans la couche distincte d'une configuration structuremap. J'ai essayé d'enregistrer tous les gestionnaires et les requêtes dynamiquement mais je couldn't.When je tente de lancer l'application que je reçois l'erreur d'exécution:Impossible d'enregistrer Mediatr automatiquement via structuremap IoC

Aucune instance par défaut est enregistré et ne peut pas être déterminé automatiquement pour le type « IRequestHandler » Il est aucune configuration spécifiée pour 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<,>)); 
    } 

contrôleur var query = new GetUserQuery(id);var user = _mediator.Send(query);

requête

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

    public int Id { get; set; } 
} 

gestionnaire

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

est tout cela dans un ensemble (projet?) – Alex

+0

Non @ Alex, dans différents –

Répondre

1

Vous devez ajouter quelque chose comme

scan.AssemblyContainingType<GetUserHandler>(); 

Pour votre registre

0

RÉPONSE J'ai ajouté à La méthode d'analyse quelques commandes pour la numérisation d'autres projets de la solution, après cela, j'ai appelé la méthode LookForRegistries. Si vous souhaitez des types d'analyse et des implémentations dans d'autres projets, vous devez définir la règle d'analyse des DLL spécifiques dans la méthode Scan.

    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

vous pouvez utiliser AssemblyContainingType, selon ma réponse – Alex