微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Asp.Net Core中注入带有参数的服务,其中一个参数是嵌套服务,其他参数是常用变量

如何解决在Asp.Net Core中注入带有参数的服务,其中一个参数是嵌套服务,其他参数是常用变量

如何将几个参数传递给构造函数,其中一个参数是嵌套服务,第二个参数是普通变量。我看过一些文章,解释了如何使用嵌套服务执行此操作。建议与工厂一起进行。但是我还有一个参数。以下是我的服务的示例。

class RootService : IRootService
{
   private readonly ILogger<RootService> _logger;
   private bool _myParam;

   public RootService(ILogger<RootService> logger,bool myParam) =>
      (_logger,_myParam) = (logger,myParam);
 
}

以下是依赖项注册的示例。

serviceCollection.AddSingleton(<IRootService,RootService>( _ => new RootService(myParam)));

ILogger由幕后的框架自动注入。

解决方法

您应该听您读过的提及工厂的文章,因为这绝对是个好建议。

.net核心容器为您的组合根目录中的内联工厂提供了很好的支持,以应对奇怪的情况。我部分同意Ihor,尽管IOptions<T>是从配置文件中加载某些东西。

真的,这取决于您的预期用例。毕竟,您的代码应为SOLID,并且您的类应诚实了解其通过构造函数定义的依赖关系。

嵌套的依赖项听起来有些奇怪,因为类似的事情应该由您的容器来处理。然后,容器可以使您的服务需要服务!那是它的工作,如果不可能,那么您可能需要重新考虑您的设计,以减少耦合并使其更加抽象。凡事都有单一责任,可以作为服务注入。考虑一下SOLID。

如果您的任何构造函数依赖项需要原始类型或采用字符串,则应在合成根目录下的工厂中进行注册。

,

这是创建options pattern的场景之一。

  1. 创建您的强类型选项类:
public class RootServiceOptions
{
    public bool MyParam { get; set; }
}
  1. 更改您的构造函数以接受IOptions<RootServiceOptions>的实例:
class RootService : IRootService
{
   private readonly ILogger<RootService> _logger;
   private readonly bool _myParam;

   public RootService(ILogger<RootService> logger,IOptions<RootServiceOptions> options) =>
      (_logger,_myParam) = (logger,options.Value.MyParam);
}
  1. 使用Configure extension methodRootServiceOptions / Startup.cs中创建并填充ConfigureServices
// o is of type RootServiceOptions and is the instance that will be injected
services.Configure<RootServiceOptions>(o => o.MyParam = <boolean value from somewhere>);
  1. 利润。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。