是否可以扩展MetadataType类以向字段添加额外的装饰器?

时间:2016-11-16 10:55:05

标签: c# asp.net-mvc

c#支持使用MetadataType类将其他装饰器应用于您不想直接编辑的类(例如,他们可能从实体框架中生成类)

作为一个简单的例子:

//auto generated class definition
public partial class DataClass
{
    public string DisplayName {get;set;}
}

//apply a metadata definition
[MetadataType(typeof(DataClassMetadata))]
public partial class DataClass
{

}

//implement the metadata 
public class DataClassMetadata
{
  [Display(Name = "Display Name")]
  public string DisplayName {get;set;}
}

这是好的和花花公子,直到你有另一个自定义装饰器添加依赖于你不想添加到业务层的依​​赖项。例如,MVC远程验证需要引用MVC库。

我希望能够做的是在Web项目中添加另一层元数据,而不会丢失业务层中定义的元数据。

我想过使用某种继承,可能是这样的:

public class RemoteDataClassModelMetadata : DataClassMetadata
{
    [Remote("DataDisplayNameIsValid", "Validation")]
    public string DisplayName { get; set; }
}

然后有一个使用这个元数据定义的视图模型 - 但它似乎只是隐藏了基类上的装饰器。由于重复的成员甚至无法编译,所以让课程部分无效。

通过将所有MVC引用添加到业务层可以避免这个问题(但这意味着依赖业务层的非Web应用程序现在必须无缘无故地承担Web依赖关系)或者复制装饰器在网络项目中(但这似乎会导致好奇的错误和奇怪的行为,后来在一个新的开发人员没有意识到他们在两个地方被定义的项目)。

对于这种用例,有没有办法组合来自不同元数据类的装饰器? (或者是否有一个更好的解决方案,我完全忽视了这个问题?)

0 个答案:

没有答案