首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC核心DI中的服务注册集合

MVC核心DI中的服务注册集合
EN

Stack Overflow用户
提问于 2018-11-22 09:52:49
回答 2查看 1.7K关注 0票数 5

我上的课很简单,有策略。

代码语言:javascript
复制
 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));
        }


    }

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

代码语言:javascript
复制
services.AddTransient<ILinkQualifier, LinkQualifier>((ctx =>
            {
                var qualifiers = new List<IQualifier> {...};
                return new LinkQualifier(qialifiers);
            }));

但那看起来很糟糕..。有没有更好的解决办法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-22 10:00:10

ServiceCollection注册多个实现。

DI容器将识别IEnumerable<IQualifier>依赖项,并将传递所有已注册的实现。

代码语言:javascript
复制
services.AddTransient<IQualifier, QualifierOne>();
services.AddTransient<IQualifier, QualifierTwo>();
services.AddTransient<IQualifier, QualifierThree>();

services.AddTransient<ILinkQualifier, LinkQualifier>();

值得说明的是,实现将按注册顺序添加。当注入到调用代码中时,它们将以相同的顺序返回。根据您的需求,这可能是有用和重要的。 参考ASP.NET核心依赖项注入-注册接口的多个实现

票数 8
EN

Stack Overflow用户

发布于 2018-11-22 10:03:17

我将假设您的IEnumerable<IQualifier>可能来自生成/构造的列表以外的其他内容。

在这种情况下,您可以创建返回IEnumerable<IQualifier>的接口和实现。

代码语言:javascript
复制
public interface IQualifiersProvider
{
    IEnumerable<IQualifier> GetQualifiers();
}

public class QualifiersProvider : IQualifiersProvider
{
    //from db / whatever
    public IEnumerable<IQualifier> GetQualifiers()
    {
        return new [] {
            new Qualifier(),
            new Qualifier(),
        }
    }
}

更改LinkQualifier以获取对IQualifiersProvider的依赖关系

代码语言:javascript
复制
public class LinkQualifier : ILinkQualifier
{
    private readonly IEnumerable<IQualifier> _qualifiers;

    public LinkQualifier(IQualifiersProvider qualifiersProvider)
    {
        _qualifiers = qualifiersProvider.GetQualifiers();
    }

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

现在分别注册这些

代码语言:javascript
复制
services.AddTransient<IQualifiersProvider, QualifiersProvider>();
services.AddTransient<ILinkQualifier, LinkQualifier>();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53428178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档