【问题标题】:ASPNET CORE Dependency Injection in an attribute class属性类中的 ASPNET CORE 依赖注入
【发布时间】:2019-03-06 05:20:15
【问题描述】:

我正在尝试开发一个具有本地化服务接口的 DisplayName 属性,该接口在启动时已经注册,并且如果注入到构造函数中就可以工作。

由于无法使用构造注入,如何使本地化服务接口实例化?

这是我的代码

public class MyDisplayNameAttribute : System.ComponentModel.DisplayNameAttribute
{
    private string _resourceValue = string.Empty;
    private ILocalizationService _localizationService;
    public MyDisplayNameAttribute(string resourceKey)
       : base(resourceKey)
    {
        ResourceKey = resourceKey;
    }

    public string ResourceKey { get; set; }

    public override string DisplayName
    {
        get
        {
            _resourceValue = _localizationService.GetLocaleString(ResourceKey);

            return _resourceValue;
        }
    }

    public string Name
    {
        get { return nameof(MyDisplayNameAttribute); }
    }
}

谢谢

【问题讨论】:

  • 您有什么理由使用本地化实现自己的MyDisplayNameAttribute?为什么不使用DataAnnotations localization
  • @ArunPratap,我正在实现我自己的,因为我希望资源来自数据库,并且用户可以根据所选语言轻松更改显示标题。
  • 你不能,至少不能使用内置的 .net core DI 容器。我建议您使用自己的 IStringLocalizationFactory 从 SQL 服务器加载资源,并使用 .net 核心的内置本地化支持,例如 DisplayAttribute。
  • @Michael:您无需实现自己的属性即可从数据库中获取本地化。你需要实现IStringLocalizer/IStringLocalizerFactory。请参阅这篇博文:damienbod.com/2016/01/29/…,只需使用 ASP.NET Core 为您提供的适当机制
  • 依赖注入和属性不能很好地混合。请改写passive attributes

标签: c# asp.net-core dependency-injection inversion-of-control


【解决方案1】:

我希望你能解决这个问题,这是一个非常简单的解决方案,但你知道这是一个反模式:

   public class LocalizedDisplayNameAttribute : DisplayNameAttribute
   {
        public LocalizedDisplayNameAttribute(string Name) : base(Name)
        {
        }
        public override string DisplayName
        {
            get
            {
                var _localizationService= new HttpContextAccessor().HttpContext.RequestServices.GetService<ILocalizationService>();
                return _localizationService.Get(base.DisplayNameValue).Result;
            }
        }
    }

我希望它至少对其他人有所帮助;)

【讨论】:

    【解决方案2】:

    依赖注入正在使用控制反转 (https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.2)。因此框架控制您的应用程序,并在实例化您的 clsses 时注入通过构造函数请求的依赖项。

    请参阅此处How to create a class without constructor parameter which has dependency injection

    所以我怀疑不使用构造函数是不可能注入依赖的。

    如果你描述你的意图,可能会有另一个好的解决方案。

    【讨论】:

      猜你喜欢
      • 2015-07-07
      • 2018-06-17
      • 1970-01-01
      • 2021-04-14
      • 2016-07-03
      • 2011-11-16
      • 2020-08-11
      相关资源
      最近更新 更多