在 MVC Core DI 中注册服务集合

Sur*_*rer 4 c# dependency-injection asp.net-core-mvc

我有简单的策略课程。

 public class LinkQualifier : ILinkQualifier
    {
        private readonly IEnumerable<IQualifier> _qualifiers;

        public LinkQualifier(IEnumerable<IQualifier> qualifiers)
        {
            _qualifiers = qualifiers;
        }

        public IQualifier Qualify(Uri uri)
        {
            return _qualifiers.FirstOrDefault(q => q.CanQualify(uri));
        }


    }
Run Code Online (Sandbox Code Playgroud)

我如何在 MVC 核心 DI 容器中注册它?我发明了这样的东西:

services.AddTransient<ILinkQualifier, LinkQualifier>((ctx =>
            {
                var qualifiers = new List<IQualifier> {...};
                return new LinkQualifier(qialifiers);
            }));
Run Code Online (Sandbox Code Playgroud)

但这看起来很糟糕……有更好的解决方案吗?

Fab*_*bio 6

使用ServiceCollection.

IEnumerable<IQualifier>依赖性将通过DI容器识别并会把所有注册的实现。

services.AddTransient<IQualifier, QualifierOne>();
services.AddTransient<IQualifier, QualifierTwo>();
services.AddTransient<IQualifier, QualifierThree>();

services.AddTransient<ILinkQualifier, LinkQualifier>();
Run Code Online (Sandbox Code Playgroud)

值得明确的是,实现将按照注册的顺序添加。当注入调用代码时,它们将以相同的顺序返回。根据您的要求,这可能有用且重要。

参考ASP.NET Core 依赖注入 - 注册接口的多个实现