【问题标题】:Injecting DI service on a extension method在扩展方法上注入 DI 服务
【发布时间】:2017-02-14 20:50:28
【问题描述】:

我正在尝试在扩展方法中获取 IStringLocalizer 服务实例,这可能吗?关于如何注入它的任何建议?

我的目标是使用它的名称作为约定来翻译一个类型。

public static class I18nExtensions
{

    private IStringLocalizer _localizer; // <<< How to inject it?

    public static string GetName(this Type type)
    {
        return _localizer[type.Name].Value;
    }
}

【问题讨论】:

  • 有一些丑陋的技巧可以奏效github.com/aspnet/DependencyInjection/issues/294
  • 我认为您的扩展方法应该是它自己的服务 (ITypeNameLocalizer),因为它具有依赖关系。保留扩展方法用于不太可能更改且永远不会有依赖关系的简单逻辑。
  • @NightOwl888 +10。
  • 请注意,如果您想在 HTML 帮助程序中使用 DI,您可以在 this answer 中执行类似操作。

标签: c# dependency-injection asp.net-core extension-methods


【解决方案1】:

@NightOwl888 comment 之后,我走错了路,我最终创建了以下服务:

public class TypeNameLocalizer : ITypeNameLocalizer
{
    private IStringLocalizer localizer;

    public TypeNameLocalizer(IStringLocalizer<Entities> localizer) 
    {
        this.localizer = localizer;
    }
    public string this[Type type] 
    { 
        get
        {
            return localizer[type.Name];
        }
    }
}

信用:@NightOwl888

【讨论】:

    【解决方案2】:

    为什么不直接将IStringLocalizer 作为参数传递:

    public static string GetName(this Type type, IStringLocalizer localizer)
    {
        return localizer[type.Name].Value;
    }
    

    扩展方法的目的是扩展对象的行为。在我看来,这就是您在这里尝试做的事情。

    【讨论】:

    • 因为你需要将接口作为参数传递到任何你想使用扩展方法的地方。
    猜你喜欢
    • 2019-02-26
    • 1970-01-01
    • 2020-10-22
    • 2017-01-06
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    相关资源
    最近更新 更多