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

问题描述

我正在开发一个 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用这个注入和解析服务会更好吗?谢谢你。

标签: c#asp.net-coredependency-injection

解决方案


最好不要使用 IServiceProvider 它隐藏了你的服务的依赖假设在某些情况下你想测试这个服务 oops 你被迫模拟 IserviceProvider。你想做的任务和使用ServiceLocator没有区别这个链接可以帮你看看为什么使用ServiceLocator不好

ServiceLocator 是一种反模式

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

ASP.NET Core 中的属性注入

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


推荐阅读