有没有办法强制 WebAPI 严格遵守已发布的接口?
Is there a way to force WebAPI to strictly conform to a published interface?
我试图解决的用例是封装我们的领域模型。例如,我们有用于后端处理的内部模型,我们不想向客户公开这些模型。这种封装的主要原因之一是变化的波动性,因为我们的域对象可能比 "published" 客户端模型变化得更快。因此,我们希望将 WebApi 控制器限制为仅 return "published" 个客户端模型。
为此,我们需要在 WebApi 项目外部创建不引用内部模型的接口,然后在 WebAPI 控制器上使用这些接口,最后更改 routing/filtering 以验证 routes/methods被访问的是接口的一部分。
程序集 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
到 return 404,因为它是一条未发布的路由。
有什么想法吗?
您可以创建一个动作过滤器来检查映射的动作是否是控制器继承接口的成员。
您还可以创建一个过滤器,当手动将其归因于您不想公开的方法时 return 404 Not Found 响应。
创建程序集 C,它处理与 DomainModel 的所有交互以及 PublishedModels 的构建。在程序集 B 中,删除对 DomainModel 程序集的引用。
- 现在没有人可以在使用 or returns DomainModel 对象的程序集 B 中编写代码
- 此外,没有人可以在程序集 C 中编写公开公开 DomainModel 对象的方法,因为程序集 B 在尝试使用程序集 C 时也会出现编译错误。
您现在只需要监管项目引用,这很容易通过视觉或构建检查来完成。
我试图解决的用例是封装我们的领域模型。例如,我们有用于后端处理的内部模型,我们不想向客户公开这些模型。这种封装的主要原因之一是变化的波动性,因为我们的域对象可能比 "published" 客户端模型变化得更快。因此,我们希望将 WebApi 控制器限制为仅 return "published" 个客户端模型。
为此,我们需要在 WebApi 项目外部创建不引用内部模型的接口,然后在 WebAPI 控制器上使用这些接口,最后更改 routing/filtering 以验证 routes/methods被访问的是接口的一部分。
程序集 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
到 return 404,因为它是一条未发布的路由。
有什么想法吗?
您可以创建一个动作过滤器来检查映射的动作是否是控制器继承接口的成员。
您还可以创建一个过滤器,当手动将其归因于您不想公开的方法时 return 404 Not Found 响应。
创建程序集 C,它处理与 DomainModel 的所有交互以及 PublishedModels 的构建。在程序集 B 中,删除对 DomainModel 程序集的引用。
- 现在没有人可以在使用 or returns DomainModel 对象的程序集 B 中编写代码
- 此外,没有人可以在程序集 C 中编写公开公开 DomainModel 对象的方法,因为程序集 B 在尝试使用程序集 C 时也会出现编译错误。
您现在只需要监管项目引用,这很容易通过视觉或构建检查来完成。