在ASP.NET Core MVC AddControllers配置期间注册服务



我正在制作一个可注入服务(即使用IServiceCollection.AddSingleton…添加(,它与自定义全局操作过滤器一起工作。换句话说,我需要添加过滤器:

services.AddControllers(mvcOptions =>
{
mvcOptions.Filters.Add<MyActionFilter>();
});

但我也需要注册我的组件:

services.AddSingleton<IMyService, MyService>();

这一切都很好。然而,现在我需要将这个注册打包,以便在多个项目中重复使用。要做到这一点,我想生产一个小助手,它可以执行我的所有注册,例如:

services.AddControllers(mvcOptions =>
{
mvcOptions.AddMyService(services);
});
// or
services.AddMyService();

基本上,这个注册的使用者不需要关心操作过滤器和我的服务之间的关系——只需要我的服务可以通过依赖注入来解决。

问题是,AddControllers中的回调在图形构建后被调用,所以在该上下文中添加我的服务没有帮助。但我也无法在AddControllers回调范围之外添加我的操作过滤器(据我所知(。

不必编写两种注册方法,我的消费者将被要求调用,有没有一种方法可以实现我想要做的事情?

谢谢!

选项1:

AddControllers支持多次调用,因此您的IServiceCollection扩展可以简单如下:

services.AddSingleton<IMyService, MyService>();
services.AddControllers(mvcOptions =>
{
mvcOptions.Filters.Add<MyActionFilter>();
});

选项2:

如果您只想在假定消费者调用AddControllers的情况下注册过滤器和服务,那么您的IServiceCollection扩展方法可能如下所示:

services.AddSingleton<IMyService, MyService>();
services.Configure<MvcOptions>(mvcOptions =>
{
mvcOptions.Filters.Add<MyActionFilter>();
});

选项3:

您可以为IMvcBuilder创建一个扩展,允许消费者编写以下内容:

services.AddControllers()
.AddMyService();

为了支持这一点,请使用以下扩展方法:

public static class MvcBuilderExtensions
{
public static IMvcBuilder AddMyService(this IMvcBuilder mvcBuilder)
{
mvcBuilder.Services.AddSingleton<IMyService, MyService>();
mvcBuilder.AddMvcOptions(mvcOptions =>
{
mvcOptions.Filters.Add<MyActionFilter>();
});
return mvcBuilder;
}
}

最新更新