我试图解决的用例是我们的域模型的封装。例如,我们有一个内部模型,用于后端处理,我们不希望暴露给客户端。这种封装的主要原因之一是变化的波动性,因为我们的域对象可能比发布的#34;更快地发生变化。客户模型。因此,我们希望将WebApi控制器限制为仅返回"已发布的"客户模型。
为此,我们需要在WebApi项目之外创建没有内部模型引用的接口,然后在WebAPI控制器上使用这些接口,最后更改路由/过滤以验证正在访问的路由/方法是界面的一部分。
public class PublishedModel
{
public int Foo {get; set;}
public string Bar {get; set;}
}
public interface IPublishedAPI
{
PublishedModel GetModel(int id);
}
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,因为它是一条未发布的路线。
有什么想法吗?
答案 0 :(得分:1)
您可以创建一个操作过滤器,检查映射的操作是否是控制器的继承接口的成员。
您还可以创建一个过滤器,当手动归因于您不希望公开的方法时,会返回404 Not Found响应。
答案 1 :(得分:1)
创建程序集C,它处理与DomainModel的所有交互和PublishedModel的构造。在程序集B中,删除对DomainModel程序集的引用。
您现在只需要监控项目引用,这在视觉上或通过构建检查非常容易。