我有一个 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; }
}