问题描述
我正在为一组Web应用程序实现一个标识符类型库,并且出于合规性原因,我想将某些类型标记为不适合发送到客户端/从客户端接收。
使用变量本身不会导致运行时错误或问题,出于安全原因将其发送给客户端是不安全的。
当将禁用类型用作操作参数以为开发人员提供即时反馈和良好体验时,最好会导致编译错误。
我当前正在使用的示例:
public interface IInternalIdentifier {}
public class NonCompliantType : IInternalIdentifier {}
[ApiController]
public class BananaController : ControllerBase
{
public async Task<ActionResult> Cavendish(int good,NonCompliantType bad)
{
return Ok();
}
}
会抛出类似的东西
Error: Type [NonCompliantType : IInternalIdentifier] Cannot be used as an action parameter.
C#有内置的方式来执行类似这样的事情吗?
我们也在使用StyleCop,有没有办法创建可以做到这一点的规则?
这可以使用单元测试来完成,也可以在运行时使用反射来完成,但是我的目的是向开发人员提供有关他们如何使用这些类型的即时反馈,并保持应用程序尽可能的干净。
单元测试可能会延迟10到15分钟,而运行时间会减慢启动时间或潜在地导致生产问题。
我们的旧代码库当前正在使用基于反射的单元测试,但是由于该库将用于任何数量的Web应用程序和微服务,因此确保每个程序都有同等的测试会很麻烦且容易出错。
解决方法
一些想法:
- 您可以将项目分成几个程序集,其中Web应用程序代码的程序集无法访问包含禁止类型的程序集。但是中间会有一个或多个程序集可以访问双方(如果需要)。
- 样式警察规则应该可行。
- 我个人的选择是添加一些启动代码,这些代码使用反射来检查所有控制器操作方法,如果发现任何不喜欢的类型,则使应用程序崩溃。