有没有办法有效地使 [ModelMetadataType] 跨多个程序集工作?

Ian*_*emp 5 c# modelmetadata asp.net-core asp.net-core-webapi asp.net-core-3.1

我有一个 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; }
}
Run Code Online (Sandbox Code Playgroud)