29

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

結合を減らすためにメディエーター パターンを使用したいのですが、Jimmy BogardのライブラリMediatRを見つけました。

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

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

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

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

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

5 に答える 5

53

2016 年 7 月の時点で、MediatR の作成者である Jimmy Bogard は、MediatR と Handler を ASP.Net Core DI サービス (実際にはインターフェースであり、ASP 内でのみ使用するように制限されていません) に登録するパッケージをリリースしましIServiceCollectionMicrosoft.Extensions.DependencyInjection。 .Net コア)。

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);
  }
}
于 2016-09-17T22:56:10.140 に答える
4

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

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));
    }
}
于 2016-02-15T13:56:59.360 に答える
0

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

MyClass : IMyClass

IMyClassこれはIOC コンテナーにマップされ、インジェクションに使用できるようになります。

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()拡張機能で行ったように拡張して、独自のカスタム マッピングを作成することもできます。

于 2016-06-07T17:28:02.997 に答える