这篇文章是非常具体的,但是请尽量将其概括化。 在不直接跳入所有背景信息的情况下,核心问题是: 对于在.NET Core 2和EF Core中构建的API项目,最好的方法或实现是什么,以轻松地重用您自己的,引用第三方POCO类的POCO类集,以及通过重复使用,我的意思是您自己的POCO类不应依赖于第三方的POCO类属性,但您的端点仍应能够(轻松地)从第三方的POCO类获取数据(值/属性)。
通过使用简单的.Include
并确保引用的表/ POCO类在您自己的手中,可以很容易地编写端点来获取您自己的POCO类的字段和值,并向第三方提供其POCO类。 POCO课。但是,这也意味着,当第三方成为另一方时,所有端点均应重写,因为新的第三方具有自己的一组属性/ POCO类。但是,我们的前端/应用程序功能将或多或少保持不变,并且第三方的值/属性或多或少都是相同的(尽管某些表或列的命名/设置可能有所不同)。
一些背景信息
我将尝试得出当前的现状,为此,我将以我们的商品POCO类/表为例。
因此,我们的API解决方案(由前端应用程序调用)有2个项目,一个DAL项目(包含所有数据/数据库逻辑(Fluent API)
)和API项目本身(包含端点,视图模型,用户管理)逻辑等。我尽可能简化了它:
我们自己数据库的所有表/ POCO类都位于OwnModels
文件夹中,而第三方模型则位于TheirModels
文件夹中。他们发送给我们的规范文档(swagger文件)重新创建了他们的POCO类。在我们的数据库中,我们有一些自制的表,另一组表在我们的数据库表与其表之间充当reference table
,Commodity
是其中之一。我们正在运行一个过程,该过程将其数据库/表的数据同步到我们自己的数据库(在重新创建的表中)。
在此示例中,他们有一个名为TheirCommodity
的表,该表包含3个字段TheirCommodityID
,Name
和SortOrder
。现在,我们创建了一个具有相同名称但没有前缀的引用表(POCO类),因此为Commodity
。该表具有自己的ID(CommodityID
)和其表的引用ID(TheirCommodityID)的列,在Fluent
中此表设置为一对一关系。
引用表的大多数端点都是只读的(GET
端点),这仅仅是因为不允许我们直接在其表中修改/删除/插入数据。
上面的商品表现在设置如下:
他们的商品POCO类:
public class TheirCommodity
{
public TheirCommodity()
{
}
public long TheirCommodityID { get; set; }
public string Name { get; set; }
public long? SortOrder { get; set; }
[JsonIgnore]
public virtual Commodity Commodity { get; set; }
}
我们的(参考)商品POCO类:
public class Commodity
{
public Commodity()
{
}
public long CommodityID { get; set; }
public long TheirCommodityID { get; set; }
public virtual TheirCommodity TheirCommodity { get; set; }
}
添加了[JsonIgnore]属性,因为如果没有,它会在检索商品表的数据时落入循环引用中(两个POCO类都引用每个水獭以在FLUENT中正确完成一对一关系)。
在API中,我为此商品创建了一个GET端点,如下所示:
[HttpGet]
public async Task<IEnumerable<Commodity>> GetCommodities()
{
return await this.Context.Commodity
.Include(i => i.TheirCommodity)
.ToListAsync();
}
问题
以上所有方法都很好,但是对于另一家拥有不同表和属性的第三方的公司重用时,这是一个巨大的麻烦。
这种设置意味着我们将不得不重写所有端点以及更多端点。
因此,理想情况下,至少我认为(但这也是问题),您希望在我们自己的POCO类中获取其POCO类的所有属性,以便我们不依赖于(包括Include)其POCO类。但这还意味着您需要一些逻辑,当您从它们的表/属性中获取值时,您需要编写一个后备字段或一些查询第三方表的内容。
我不能完全围绕应该如何实现这一目标。我知道您无法编写完全可重用的完美代码(也是因为我们总是有步骤在您自己的数据库中获取第三方表以进行数据同步),但是至少应该有一些不必重写我们所有的端点。
我为宽大的文字墙表示歉意,但找不到缩短文字墙的方法。以及我对不正确使用单词的歉意(英语不是我的母语:))