繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM