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

时间:2019-04-04 19:18:50

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

WebAPI(MyProject)引用ThirdPartyLib进行数据检索和发布。在ThirdPartyLib中定义了很多模型,我想在WebAPI中重用 传递给客户/消费者。我不希望客户引用ThirdPartyLib。我找不到在MyProject中包装ThirdPartyLib模型/类的方法。

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

public class Customers : ThirdPartyLib.Models.Customers 
{

}

通过这种方式,客户必须在其项目中引用ThirdPartyLib以获得客户模型/类属性。 如何以无须每次更改或添加ThirdPartyLib模型时都更新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();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

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

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

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