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依赖关系)或者复制装饰器在网络项目中(但这似乎会导致好奇的错误和奇怪的行为,后来在一个新的开发人员没有意识到他们在两个地方被定义的项目)。
对于这种用例,有没有办法组合来自不同元数据类的装饰器? (或者是否有一个更好的解决方案,我完全忽视了这个问题?)