我在玩弄新的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());
截至7月2016年,吉米·博加德,MediatR的作者已经发布了一个包注册MediatR,和处理程序,与ASP.Net核心DI服务(这实际上是接口IServiceCollection
,在Microsoft.Extensions.DependencyInjection
来实施并不仅限于只使用ASP.Net核心内)。
MediatR.Extensions.Microsoft.DependencyInjection
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);
}
}
我得到它的工作,我的代码:
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));
}
}
我创建了一个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()
扩展做了,写自己的自定义映射。