2017-06-02 5 views
0

私は多層構造のWebアプリケーションと、構造マップ設定とは別の層にあるハンドラとクエリのクラスを持っています。すべてのハンドラとクエリを動的に登録しようとしましたが、実行できませんでした。アプリケーションを実行しようとするとランタイムエラーが発生します。 IRequestHandlerMediatrを自動的に登録することができません構造マップIoC

 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; } 
} 
に指定されない構成しません

あなたは私から他のプロジェクトをスキャンする方法いくつかのコマンドをスキャンするために追加したレジストリ

+0

すべて1のアセンブリ(プロジェクト?) – Alex

+0

@Alexいいえ、あなたは私の答えに従って、AssemblyContainingTypeを使用することができます異なる –

答えて

1

それから、メソッド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

ANSWER

scan.AssemblyContainingType<GetUserHandler>(); 

のようなものを追加する必要がありハンドラ

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

関連する問題