如何将第三方对象包装在 Web API 或库中?



WebAPI (MyProject) 引用第三方库进行数据检索和发布。在 ThirdPartyLib 中定义了许多模型,我想在 WebAPI 中重用这些模型,并且还 传递给客户端/消费者。我不希望客户端引用第三方库。我找不到一种方法将第三方库模型/类包装在MyProject中。

这是正确的方法吗?只需定义一个空的并引用第三方客户模型?序列化怎么样?

public class Customers : ThirdPartyLib.Models.Customers 
{
}

通过使用这种方式,客户端必须在其项目中引用第三方库以获取客户模型/类属性。 如何将客户模型包装在 MyProject 中,以便在第三方库模型更改或添加时不必更新 MyProject?

namespace MyProject.Controllers
{
[Authorize]
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
// GET api/values/5
[HttpGet("{id}")]
public ActionResult<ThirdPartyLib.Models.Customers> Get(int id)
{
return GetCustomers();
}
}
}

如果您的第三方库的任何部分被暴露,那么消费者将不得不依赖它。就这么简单。删除该依赖项的唯一方法是根本不公开它。

这意味着您必须映射到自己创建的类/从中映射,以表示第三方库中的类。使用者将使用您的类,您将将其映射到第三方库类以执行实际工作。然后,消费者不知道或不关心实际在做什么工作。

更明确地说,这意味着您甚至不能从第三方库继承。像MyLib.Customers : ThirdPartyLib.Customers这样的东西仍然需要依赖ThirdPartyLib,即使您只使用MyLib.Customers.您需要创建一个干净的 POCO,它不会继承任何内容,或者至少不会继承库外的任何内容,以便您的Customers版本。这就是映射部分的用武之地。基本上,您将属性的值从Customers实例移动到第三方库Customers的实例。这可以手动处理,逐个道具处理,或者您可以使用像AutoMapper这样的库根据约定/配置为您完成。

最新更新