【发布时间】: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