У меня есть такой класс:
public class LocalizedDataAnnotationsModelMetadataProvider : DataAnnotationsModelMetadataProvider
{
protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType,
Func<object> modelAccessor, Type modelType, string propertyName)
{
var meta = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
if (string.IsNullOrWhiteSpace(propertyName))
return meta;
if (meta.DisplayName == null)
GetLocalizedDisplayName(meta, propertyName);
if (string.IsNullOrWhiteSpace(meta.DisplayName))
{
string resource = string.Format("{0}_{1}", meta.ContainerType.Name, meta.PropertyName).ToLower();
meta.DisplayName = string.Format("[{0}]", resource);
}
return meta;
}
private static void GetLocalizedDisplayName(ModelMetadata meta, string propertyName)
{
ResourceManager rm = new ResourceManager(typeof (i18n));
CultureInfo culture = Thread.CurrentThread.CurrentUICulture;
string resource = string.Format("{0}_{1}", meta.ContainerType.Name, meta.PropertyName).ToLower();
meta.DisplayName = rm.GetString(resource, culture);
}
}
Я хочу абстрагироваться от линии
ResourceManager rm = new ResourceManager(typeof (i18n));
Я хочу сделать этот класс независимым от типа i18n
. Я хочу иметь возможность указать тип для менеджера ресурсов при построении/инициализации, сделать класс более универсальным и поместить его в отдельную библиотеку классов.
Каковы мои варианты? Можно ли это сделать со статическим классом или мне нужен нестатический класс? Или я могу просто оставить все как есть, абстрагировать rm
как поле класса и инициализировать его в конструкторе?
Спасибо
ОБНОВЛЕНИЕ. Обратите внимание, что класс, скорее всего, будет использоваться на различных сайтах ASP.NET MVC в global.asax.cs, например:
protected override void OnApplicationStarted()
{
base.OnApplicationStarted();
ModelMetadataProviders.Current = new LocalizedDataAnnotationsModelMetadataProvider();
}
На самом деле я никогда не ссылаюсь на этот класс и не использую его напрямую, ASP.NET MVC делает все «под капотом».
DisplayAttribute
объявлений свойств модели с указанным типом ресурса и именем ресурса (при условии, чтоDisplayAttribute
работает правильно для используемой вами структуры (например, это работает нормально в MVC3, но не в MVC2)) - person Russ Cam   schedule 24.08.2011