gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:37:56 24 4
gpt4 key购买 nike

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

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

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

services.AddSingleton<IMyService, MyService>();

这一切都很好。但是,现在我需要打包此注册以便在多个项目中重复使用。为此,我想制作一个可以执行我所有注册的小 helper ,例如:

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

基本上,这个注册的消费者不需要关心 Action 过滤器和我的服务的关系——只要我的服务可以通过依赖注入(inject)来解决。

问题是,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;
}
}

关于c# - 在 ASP.NET Core MVC AddControllers 配置期间注册服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65337275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com