2016-02-15 19 views
8

私は新しいASP.NETコアを使いこなしています。現在、JavaScriptのフロントエンドから呼び出すAPIを作成しています。ASP.NET Coreを使用したMediatR DI

カップリングを減らすためにメディエーターパターンを使用したいと思いますが、ジミーボガードのライブラリMediatRが見つかりました。

私の問題は、DIのビルドを使用して配線しています。私はexamplesを見てみましたが、起動クラスのConfigureServicesメソッドにどのようにバインドするのか分かりません。

誰にも洞察はありますか?

UPDATE:、

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

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

https://github.com/jbogard/MediatR/blob/master/samples/MediatR.Examples.AspNetCore/Program.csはかなりいるようです私には、しかし、アセンブリのための簡単なあなたは、このScrutorパッケージ(ASP.NETコアのDIは、アセンブリスキャンが付属していませんし、それを出荷する予定はありません) – Tseng

+0

どのようにConfigureServiceメソッドにそれを追加しますが必要なスキャン? 'services.AddTransient(typeof演算(IMediator)、BuildMediator()メソッドGetType());あなたはそのように登録したくない' – Nyegaard

+1

は、一時はそれが依存関係が解決されるたびに作成されることを意味します。 'services.AddScoped (P => T => p.GetRequiredService(T));'と 'services.AddScoped (P => T => p.GetRequiredServices(T));'あるファクトリメソッド – Tseng

答えて

16

MediatRの著者Jimmy Bogardは、MediatRおよびHandlersをASP.Net Core DIサービス(実際にはに実装されているインターフェイスIServiceCollection)で登録するパッケージをリリースしました。 ASP.Net Core内でのみ使用することができます)。

MediatR.Extensions.Microsoft.DependencyInjection

Link to GitHub Project

Link to NuGet Package information

パッケージを導入するブログ記事と、それは能力が(非常に短い)のブログ記事から直接コピーhere

例登録見つけることができます:このパッケージには、MediatRを有効にするには、いくつかの機能を実行

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

    services.AddMediatR(typeof(Startup)); 
} 

ハンドラのアセンブリの必要なスキャンを含む:

ハンドラが配置されているアセンブリを渡すか、それらのハンドラが存在するアセンブリから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); 
    } 
} 
+2

これは正解でなければなりません。よりエレガントでシンプルなだけでなく、Mediatrの作成者が推奨するものです。自分の意見に - – reydelleon

+1

まあ、それは正しい答えが「彼らの特定の問題を解決し、質問アスカーによって選ばれた一つであることStackOverflowsポリシーです。それ以降の回答、またはより広範に役立つ回答が人々の注目を集めていることを否定しています。しかし、私は人々が1時間以内に自分の質問に答えるのを止め、実際に人々に答えられるようにしたいと考えています。間違った、貧しい、または期限切れの回答が数多くあり、隣に緑色のダニがあります。私は、すべての回答を読んで、それにふさわしいものを判断し、投稿日に注意を払うようアドバイスします。 – dmcquiggin

+0

残念ながら、そのライブラリはハンドラがパブリッククラスである場合にのみ機能します。たとえば、内部スコープの可視性で定義されている場合、それは動作しません。 – Lorenzo

2

私はそれが働いて得た私のコ​​ード::私はそれが私のConfigureService方法から、作業しました

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)); 
    } 
} 
0

私はDI helper for ASP.NET Core RC2を作成しましたあなたのスタートアップに追加することができます。それは、注射のためにそれを利用できるようになりますIOCコンテナにIMyClassをマッピングします

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

関連する問題