web-dev-qa-db-ja.com

MediatRとASP.NET Core DI

新しいASP.NET Coreをいじって、現在、JavaScriptフロントエンドから呼び出すAPIを作成しています。

メディエーターパターンを使用してカップリングを減らしたいのですが、Jimmy Bogardのライブラリ MediatR を見つけました。

私の問題は、ビルドインDIを使用してそれを配線することにあります examples を試してみましたが、スタートアップクラスのConfigureServicesメソッドにバインドする方法をクラックすることがわかりません。

誰か洞察力がありますか?

更新:私はそれを私のConfigureServiceメソッドから動作させました:

services.AddScoped<SingleInstanceFactory>(p => t => p.GetRequiredService(t));

services.Scan(scan => scan
        .FromAssembliesOf(typeof(IMediator), typeof(MyHandler.Handler))
        .AddClasses()
        .AsImplementedInterfaces());
19
Nyegaard

MediatRの作者であるJimmy Bogardが2016年7月の時点で、MediatRとハンドラーをASP.Net Core DIサービス(実際にはMicrosoft.Extensions.DependencyInjectionに実装されているインターフェイスIServiceCollectionである)に登録するパッケージをリリースしました。 ASP.Net Core内での使用のみに制限されません)。

MediatR.Extensions.Microsoft.DependencyInjection

GitHubプロジェクトへのリンク

NuGetパッケージ情報へのリンク

パッケージとその機能を紹介するブログ投稿 ここ を見つけることができます

(非常に短い)ブログ投稿から直接コピーした登録の例:

public void ConfigureServices(IServiceCollection services)
{
  services.AddMvc();

  services.AddMediatR(typeof(Startup));
}

このパッケージは、ハンドラーに必要なアセンブリのスキャンなど、MediatRを有効にするためのいくつかの機能を実行します。

ハンドラが存在するアセンブリを渡すか、それらのハンドラが存在するアセンブリからTypeオブジェクトを渡すことができます。拡張機能により、IMediatorインターフェイスがサービス、すべてのハンドラー、およびハンドラーをロードするための適切なデリゲートファクトリーに追加されます。次に、コントローラーでIMediator依存関係を使用できます。

public class HomeController : Controller
{
  private readonly IMediator _mediator;

  public HomeController(IMediator mediator)
  {
    _mediator = mediator;
  }
  public IActionResult Index()
  {
    var pong = _mediator.Send(new Ping {Value = "Ping"});
    return View(pong);
  }
}
29
dmcquiggin

私はそれを機能させました、私のコード:

public void ConfigureServices(IServiceCollection services)
{
      services.AddScoped<SingleInstanceFactory>(p => t => p.GetRequiredService(t));
      services.AddScoped<MultiInstanceFactory>(p => t => p.GetRequiredServices(t));
      services.Scan(scan => scan
              .FromAssembliesOf(typeof(IMediator), typeof(MyHandlerOne.Handler))
              .FromAssembliesOf(typeof(IMediator), typeof(MyHandlerTwo.Handler))
             .AddClasses()
             .AsImplementedInterfaces());
}

そして、MultiInstanceFactoryが必要とするGetRequiredServiceを実装するクラスがあります。

public static class GetServices
{
    public static IEnumerable<object> GetRequiredServices(this IServiceProvider provider, Type serviceType)
    {
        return (IEnumerable<object>)provider.GetRequiredService(typeof(IEnumerable<>).MakeGenericType(serviceType));
    }
}
3
Nyegaard

https://dotnetcoretutorials.com/ による優れたチュートリアルがあります。これは、MediatRを正しくインストールおよび構成するためのサンプルコードです。

MediatRのインストール

まず、MediatR nugetパッケージをインストールする必要があります。したがって、パッケージマネージャーコンソールから次のコマンドを実行します。

インストールパッケージMediatR

また、.NET Coreの組み込みのIOCコンテナを使用できるようにするパッケージもインストールする必要があります(後で詳しく説明します)。したがって、次のパッケージもインストールします。

インストールパッケージMediatR.Extensions.Microsoft.DependencyInjection

最後に、startup.csファイルを開きます。 ConfigureServicesメソッドでは、MediatRのすべての依存関係を登録するための呼び出しを追加する必要があります。

public void ConfigureServices(IServiceCollection services)
{
    services.AddMediatR(Assembly.GetExecutingAssembly());
    //Other injected services. 
}

これはリンクです: https://dotnetcoretutorials.com/2019/04/30/the-mediator-pattern-part-3-mediatr-library/

これがお役に立てば幸いです。

スタートアップに追加できる ASP.NET Core RC2のDIヘルパー を作成しました。基本的なコンベンションベースのマッピングを提供するので、次のようなクラスがある場合:

_MyClass : IMyClass
_

これは、IOCコンテナー内のIMyClassをマップして、注入に使用できるようにします。

MediatRのマッピングも追加しました。

使用するにはプロジェクトにクラスを追加し、startup.csクラスでConfigureServices()メソッドに必要な行を追加します。

_public void ConfigureServices(IServiceCollection services)
{
    //Other Code here......

    var ioc = new PearIoc(services);

    //ioc.AddTransient<IEmailSender, AuthMessageSender>();
    //ioc.AddTransient<ISmsSender, AuthMessageSender>();

    ioc.WithStandardConvention();
    ioc.WithMediatR();
    ioc.RunConfigurations();
}
_

便宜上AddTransient()メソッドを追加しました(services.AddTransient()を使用することもできます)が、さらに必要な場合に備えてIServiceCollectionを公開します。

また、.WithMediatR()拡張機能で行ったように拡張して、独自のカスタムマッピングを作成することもできます。

0
Colin Pear