【发布时间】: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