如何解决在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的场景之一。
- 创建您的强类型选项类:
public class RootServiceOptions
{
public bool MyParam { get; set; }
}
- 更改您的构造函数以接受
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);
}
- 使用
Configure
extension method在RootServiceOptions
/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>);
- 利润。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。