[英]Register a service during ASP.NET Core MVC AddControllers configuration
我正在制作一个可注入服务(即使用 IServiceCollection.AddSingleton... 添加),它与自定义全局操作过滤器一起使用。 换句话说,我需要添加过滤器:
services.AddControllers(mvcOptions =>
{
mvcOptions.Filters.Add<MyActionFilter>();
});
但我还需要注册我的组件:
services.AddSingleton<IMyService, MyService>();
这一切都很好。 但是,现在我需要将 package 这个注册起来,以便在多个项目中重复使用。 为此,我想制作一个可以执行我所有注册的小助手,例如:
services.AddControllers(mvcOptions =>
{
mvcOptions.AddMyService(services);
});
// or
services.AddMyService();
基本上,这个注册的消费者不需要关心动作过滤器和我的服务的关系——只要我的服务可以通过依赖注入来解决。
问题是,AddControllers 中的回调在图表构建后被调用,因此在该上下文中添加我的服务没有帮助。 但我也无法在 AddControllers 回调 scope 之外添加我的操作过滤器(据我所知)。
不必编写两种注册方法,我的消费者将需要调用,有没有办法完成我想要做的事情?
谢谢!
选项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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.