繁体   English   中英

合并到多个构造函数中注入的相同服务的最佳方法是什么?

[英]What is the best way to merge into one same services injected in several constructors?

我正在开发 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不好

ServiceLocator 是一种反模式

但是,如果您真的想在任何情况下都这样做,构造函数注入并不是您可以用来注入依赖项的唯一方法。 还有一种方式叫做属性注入 这是一个很好的关于属性注入的讨论

ASP.NET Core 中的属性注入

不要忘记你可以配置 asp.net core 来使用其他一些支持属性注入的 IOC 容器,比如 Castle Windsor 或 Unity

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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