我正在使用ASP.NET Core创建一个Web API,我正在使用SimpleInjector作为我的DI框架。我理解how to use SI with ASP.NET Core的基础知识;我的问题更像是建筑问题。
我有一个项目,包含API项目的集成测试,以便测试原始API端点和响应。当然,测试服务器(使用Microsoft.AspNetCore.TestHost
设置)应该使用API项目的真实Startup
类。
问题在于在哪里为控制器的依赖项注册模拟,因为我不希望在测试时注册所有生产实现:首先,它们中的大多数当然是生产实现使用的依赖项控制器依赖关系我将首先嘲笑;其次,如果我更新我的控制器并忘记注册新依赖项的模拟,我希望我的代码失败(容器验证),而不是静默使用容器中存在的生产依赖项。
因此,无法在Startup
类中注册依赖项。这对我来说没问题 - 我认为我宁愿将组合根保持在引用所有其他组件的单独组件中。 ASP.NET Core项目的AFAICS需要引用这个项目,该项目公开了一个返回预先注册的容器的方法,该容器可以在Startup
类中使用,需要注册例如控制器激活器(并将进行最终验证)。
但这引出了一个问题:如何将容器 - 已经在我的所有应用程序组件中注册(无论是来自组合根项目的生产实现,还是来自集成测试项目的模拟) - 到我的Startup
类中?
我的初始解决方案是在Startup
类上简单地使用静态属性,例如Container
,并在使用WebHostBuilder
之前指定。这看起来“实用健壮”:如果在NullReferenceException
类运行之前未设置应用程序,应用程序将快速失败(Startup
),并且该属性仅在安装期间使用,因此我不需要防止多次设置或设置为空或任何此类事情 - 如果它在启动之前分配,它可以工作,如果没有,它将无法启动。
这看起来像是一个可靠的解决方案,还是我忘记了以后任何明显的方法会让我再次咬我?有没有更好的解决方案?