c# - 合并到多个构造函数中注入的相同服务的最佳方法是什么?
问题描述
我正在开发一个 ASP.net 核心应用程序,当然还使用依赖注入。主要是在页面或其他服务的构造函数中注入需要的服务。其中一些注入服务在几乎所有其他构造函数中都是相同的。例如,有一个ILogger<T>
,一个IAppInfo
保存一些应用程序范围的信息,还有一个IFileServices
用于许多其他服务。所以我最终在构造函数中进行了大量注入,其中一些超过 7 个。问题是,这是摆脱几乎每个构造函数中使用的所有参数的最佳方法?
现在我已经用方法实现了另一个服务来获得所需的服务:
public interface IBasicsService<out T>
{
ILogger<T> GetLogger();
ApplicationInfo GetApplicationInfo();
}
实施于:
public class BasicsService<T> : IBasicsService<T>
{
private readonly ILogger<T> _logger;
private readonly ApplicationInfo _info;
// ReSharper disable once ContextualLoggerProblem
public BasicsService(ApplicationInfo info, ILogger<T> logger) {
_info = info;
_logger = logger;
}
public ILogger<T> GetLogger() {
return _logger;
}
public ApplicationInfo GetApplicationInfo() {
return _info;
}
}
那是对的吗?IServiceProvider
用这个注入和解析服务会更好吗?谢谢你。
解决方案
最好不要使用 IServiceProvider 它隐藏了你的服务的依赖假设在某些情况下你想测试这个服务 oops 你被迫模拟 IserviceProvider。你想做的任务和使用ServiceLocator没有区别这个链接可以帮你看看为什么使用ServiceLocator不好
但是,如果您真的想在任何情况下这样做,构造函数注入并不是您可以用来注入依赖项的唯一方法。还有另一种称为属性注入的方法这是关于属性注入的一个很好的讨论
不要忘记您可以配置 asp.net core 以使用其他一些支持属性注入的 IOC 容器,例如 Castle Windsor 或 Unity
推荐阅读
- gremlin - Gremlin 反向遍历
- python - 了解 C++ 中的 pop_heap 以在 Python 中实现
- typo3 - 如何按字段对记录进行排序
- python - 在 K-means 中使用数组的问题
- regex - 如何在 Delphi DFM 组件声明中搜索缺失的属性?
- azure - 登录到 Azure 存储容器时的自定义文件夹
- python - 如何将 GridSearchCV 中的验证集与训练集分开标准化?
- google-apps-script - browser.inputbox() 不适用于 onedit triggerT
- angular - Angular KeyValuePie 和 ngFor 奇怪的行为
- java - 在两个活动之间传递后字符串为空