有没有一种方法可以有效地使[ModelMetadataType]跨多个程序集工作?

时间:2020-09-08 11:42:17

标签: c# asp.net-core asp.net-core-webapi asp.net-core-3.1 modelmetadata

我有一个ASP.NET Core 3.1 Web API应用程序,该应用程序具有各种模型,这些模型的端点用于输入和输出数据。因为其他C#应用程序将与此通信,所以我决定将这些共享模型移到所有应用程序都可以使用的NuGet包中。

通常,这些模型的属性都装饰有各种数据注释属性,例如[Required],以便允许标准模型验证来防止输入无效。它们还装饰有特定的ASP.NET MVC Core属性,例如[FromQuery],以便允许它们正确地绑定到传入的请求。

但是,我不希望ASP.NET MVC Core属性出现在共享的NuGet包中。首先,由于它们仅与Web API有关,因此在此处应用它们是有意义的。其次,因为将它们包含在NuGet中将引入与ASP.NET Core相关的各种依赖关系,这些依赖关系又与该程序包的其他使用者无关。

ASP.NET Core具有[ModelMetadataType]属性,涵盖了这一点-但仅当所讨论的模型位于同一程序集中时才适用。 是否有内置或简单的方法可以使[ModelMetadataType]在不同的程序集中工作,而无需子类化和/或重新声明模型?

(我完全知道,允许这样做会导致下游使用者潜在地改变上游模型的行为,从而造成安全风险,但是由于这些模型,此程序包以及相关应用程序都是我所工作的公司的内部,在这种情况下这不是问题。)

说明基本概念的代码示例:

// NuGet package - model declaration
public class MyModel
{
    [Required]
    public int MyProperty { get; set; }
}

...

// ASP.NET Core web API - enrich model with additional metadata
public class MyModelMetadata
{
    [FromQuery(Name = "foo")]
    public int MyProperty { get; set; }
}

...

// ASP.NET Core web API - desired effective (composite) model
public class MyModel
{
    [Required]
    [FromQuery(Name = "foo")]
    public int MyProperty { get; set; }
}

0 个答案:

没有答案