web-dev-qa-db-fra.com

MediatR avec ASP.NET Core DI

Je joue avec le nouveau noyau ASP.NET et je crée actuellement une API que je veux appeler depuis une interface JavaScript.

Je veux utiliser le modèle de médiateur pour réduire le couplage et j'ai trouvé Library MediatR de Jimmy Bogard.

Mon problème consiste à le câbler en utilisant le DI intégré, j'ai essayé de regarder les exemples , mais je ne vois pas comment il se lie à la méthode ConfigureServices de la classe de démarrage. 

Quelqu'un a-t-il un aperçu?

UPDATE: Je l'ai fait fonctionner, à partir de ma méthode ConfigureService:

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

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

Depuis juillet 2016, Jimmy Bogard, auteur de MediatR, a publié un package pour enregistrer MediatR, ainsi que Handlers, avec le service ASP.Net Core DI (qui est en fait l’interface IServiceCollection, implémentée dans Microsoft.Extensions.DependencyInjection et qui n’est pas limitée à un usage unique. dans ASP.Net Core). 

MediatR.Extensions.Microsoft.DependencyInjection

Lien vers le projet GitHub .

Lien vers les informations sur le paquet NuGet .

Un article de blog présentant le paquet et ses capacités peut être trouvé ici

Exemple d'enregistrement copié directement à partir du blog (très court):

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

  services.AddMediatR(typeof(Startup));
}

Ce package remplit plusieurs fonctions pour activer MediatR, y compris l'analyse requise des assemblys pour les gestionnaires:

Vous pouvez soit transmettre les assemblys où se trouvent vos gestionnaires, soit transmettre des objets Type à partir d'assemblys où ces gestionnaires résident. L'extension ajoutera l'interface IMediator à vos services, à tous les gestionnaires et aux fabriques de délégués appropriées pour charger les gestionnaires. Ensuite, dans votre contrôleur, vous pouvez simplement utiliser une dépendance 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);
  }
}
21
dmcquiggin

Je l'ai fait fonctionner, mon code:

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

et j'ai une classe qui implémente GetRequiredService dont MultiInstanceFactory a besoin:

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

J'ai créé un utilitaire DI pour ASP.NET Core RC2 que vous pouvez ajouter à votre démarrage. Il vous donne un mappage de base basé sur des conventions, donc si vous avez une classe comme:

MyClass : IMyClass

Il mappera IMyClass dans le conteneur IOC, ce qui le rendra disponible pour l'injection.

J'ai également ajouté les mappages pour MediatR.

Pour l'utiliser, ajoutez simplement la classe à votre projet, puis dans la classe startup.cs, ajoutez les lignes nécessaires à la méthode 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();
}

J'ai ajouté la méthode AddTransient() juste pour des raisons pratiques (vous pouvez également utiliser services.AddTransient()), mais elle expose également la IServiceCollection au cas où vous auriez besoin de faire plus avec.

Vous pouvez également l'étendre comme je l'ai fait avec l'extension .WithMediatR() et écrire vos propres mappages personnalisés.

0
Colin Pear