MediatR与ASP.NET核心DI

问题描述 投票:17回答:3

我在玩弄新的ASP.NET核心,并正在创造我想从一个JavaScript前端调用API。

我想用调解模式,以减少耦合,我发现从吉米·博加德图书馆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());
c# asp.net asp.net-core mediatr
3个回答
29
投票

截至7月2016年,吉米·博加德,MediatR的作者已经发布了一个包注册MediatR,和处理程序,与ASP.Net核心DI服务(这实际上是接口IServiceCollection,在Microsoft.Extensions.DependencyInjection来实施并不仅限于只使用ASP.Net核心内)。

MediatR.Extensions.Microsoft.DependencyInjection

Link to GitHub Project

Link to NuGet Package information

博客文章介绍了包,它的功能可以发现here

示例注册直接从(很短)的博客文章复制

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

  services.AddMediatR(typeof(Startup));
}

这个软件包执行若干功能,以使MediatR,包括组件的用于处理程序所需要的扫描:

您可以在组件通过您的处理程序,也可以在类型的对象从这些地方居住的处理程序组件通过。扩展将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);
  }
}

3
投票

我得到它的工作,我的代码:

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

我有一个实现了GetRequiredService是MultiInstanceFactory需要一个类:

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,你可以添加到启动。它给你基本的约定基于映射,所以如果你有这样一个类:

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()扩展做了,写自己的自定义映射。

© www.soinside.com 2019 - 2024. All rights reserved.