【问题标题】:Is there a way to force WebAPI to strictly conform to a published interface?有没有办法强制 WebAPI 严格遵守已发布的接口?
【发布时间】:2017-01-01 03:17:17
【问题描述】:

我试图解决的用例是我们的领域模型的封装。例如,我们有用于后端处理的内部模型,我们不希望将其暴露给客户。这种封装的主要原因之一是变化的波动性,因为我们的领域对象可能比“已发布”的客户端模型变化得更快。因此,我们希望将 WebApi 控制器限制为仅返回“已发布”的客户端模型。

为此,我们需要在 WebApi 项目之外创建不引用内部模型的接口,然后在 WebAPI 控制器上使用这些接口,最后更改路由/过滤以验证正在访问的路由/方法是界面的一部分。

程序集 A

public class PublishedModel
{
    public int Foo {get; set;}
    public string Bar {get; set;}
}

public interface IPublishedAPI
{
    PublishedModel GetModel(int id);
}

程序集 B

public class MyApi : ApiController, IPublishedAPI
{
    public IDomainManager _manager;

    public MyApi(IDomainManager manager)
    {
        _manager = manager;
    }

    [HttpGet]
    [Route("good/{id}")]
    public PublishedModel Good(int id)
    {
          DomainModel domainModel = _manager.GetDomainModelById(id);
          return new PublishedModel
          {
              Foo = domainModel.Foo,
              Bar = domainModel.Bar,
          }
    }

    [HttpGet]
    [Route("bad/{id}")]
    public DomainModel Bad(int id)
    {
          var domainModel = _manager.GetDomainModelById(id);
          return domainModel;
    }
}

在上面的示例中,我希望调用 /bad/1 以返回 404,因为它是未发布的路由。

有什么想法吗?

【问题讨论】:

  • 你可以限制你的类在 WebAPI 中显示的内容。只显示那些你想“发布”的字段
  • 您可以创建一个动作过滤器来检查调用的动作是否是控制器继承接口的成员。您还可以创建一个过滤器,当归因于您不希望暴露的方法时返回 404
  • @ElenaDBA 您能否详细说明如何“限制显示的内容”?您是否正在考虑为属性添加一些属性?谢谢!
  • @Nkosi 过滤器是我对如何完成此任务的最佳猜测,感谢您验证我的想法! :) 我认为您应该将该回复添加为答案,以便我们所有人都可以投票。
  • 为什么Bad 存在?有内部呼叫者吗?

标签: c# asp.net-web-api asp.net-web-api-routing


【解决方案1】:

创建程序集 C,它处理与 DomainModel 的所有交互以及 PublishedModels 的构建。在程序集 B 中,删除对 DomainModel 程序集的引用。

  • 现在没有人可以在程序集 B 中编写使用或返回 DomainModel 对象的代码
  • 同样没有人可以在程序集 C 中编写公开公开 DomainModel 对象的方法,因为程序集 B 在尝试使用程序集 C 时也会出现编译错误。

您现在只需要监管项目引用,这很容易在视觉上或通过构建检查来完成。

【讨论】:

  • 我喜欢布兰登的回答。它强制执行接口隔离。 “不应强迫客户端实现它不使用的接口,也不应强迫客户端依赖它们不使用的方法”(scotch.io/bar-talk/…)
【解决方案2】:

您可以创建一个动作过滤器来检查映射的动作是否是控制器继承接口的成员。

您还可以创建一个过滤器,当手动归因于您不希望公开的方法时,它会返回 404 Not Found 响应。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 2010-11-06
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    • 2015-04-02
    相关资源
    最近更新 更多