我上的课很简单,有策略。
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容器中注册?我发明了这样的东西:
services.AddTransient<ILinkQualifier, LinkQualifier>((ctx =>
{
var qualifiers = new List<IQualifier> {...};
return new LinkQualifier(qialifiers);
}));但那看起来很糟糕..。有没有更好的解决办法?
发布于 2018-11-22 10:00:10
向ServiceCollection注册多个实现。
DI容器将识别IEnumerable<IQualifier>依赖项,并将传递所有已注册的实现。
services.AddTransient<IQualifier, QualifierOne>();
services.AddTransient<IQualifier, QualifierTwo>();
services.AddTransient<IQualifier, QualifierThree>();
services.AddTransient<ILinkQualifier, LinkQualifier>();值得说明的是,实现将按注册顺序添加。当注入到调用代码中时,它们将以相同的顺序返回。根据您的需求,这可能是有用和重要的。 参考ASP.NET核心依赖项注入-注册接口的多个实现
发布于 2018-11-22 10:03:17
我将假设您的IEnumerable<IQualifier>可能来自生成/构造的列表以外的其他内容。
在这种情况下,您可以创建返回IEnumerable<IQualifier>的接口和实现。
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的依赖关系
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));
}
}现在分别注册这些
services.AddTransient<IQualifiersProvider, QualifiersProvider>();
services.AddTransient<ILinkQualifier, LinkQualifier>();https://stackoverflow.com/questions/53428178
复制相似问题