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