通过扩展方法注入DI服务

Tia*_*ago 7 c# extension-methods dependency-injection asp.net-core

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

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

public static class I18nExtensions
{

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

    public static string GetName(this Type type)
    {
        return _localizer[type.Name].Value;
    }
}
Run Code Online (Sandbox Code Playgroud)

Hen*_*ema 5

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

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

扩展方法的目的是扩展对象的行为。在我看来,这就是你想要在这里做的事情。

  • 因为无论您想要使用扩展方法,都需要将接口作为参数传递。 (6认同)

Tia*_*ago 5

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

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];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

信用:@ NightOwl888