c# - 当依赖是循环的时,如何在 Startup.cs 中实现依赖注入?
问题描述
我有一个MyProject项目,其中我有实现的IMyService
接口和MyService
类IMyService
。在 Startup.cs 类中,我依赖注入它们:
// MyProject project | Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IMyService, MyService>();
}
因为MyService
有很多依赖项(对第 3 方进行多次 REST 调用等),所以我想为开发环境创建一个存根版本。我创建了引用MyProject的新MyStubsProject。我实现了MyStubsProject的存根版本:IMyService
// MyStubsProject project
public class MyStubService : IMyService
{
...
}
所以现在我想在 Startup.cs 类中添加依赖注入:
// MyProject project | Startup.cs
public void ConfigureServices(IServiceCollection services)
{
if (isDevelopmentEnvironment)
services.AddScoped<IMyService, MyStubService>();
else
services.AddScoped<IMyService, MyService>();
}
但是如果我添加它, MyProject和MyStubsProject之间将存在循环依赖关系。
我应该如何在 Startup.cs 中实现对类MyStubService
或MyStubsProject项目的引用?
解决方案
最好的答案可能是将您的服务内容提取到一个单独的项目中,或者至少是服务合同(IMyService
)。这应该让您现有的两个项目都引用服务合同而没有任何冲突。如果您想添加其他接口或添加同一接口的更多实现,现在这也很容易。
另一个好处可能是更好的整体架构:将合约保存在没有任何实际逻辑(仅接口)的单独项目中通常会产生更好的组织和更清晰的代码。
推荐阅读
- php - php 检查特定模式
- php - 如何使用邮递员在 laravel 中构建一个 api 来关注和取消关注用户
- javascript - 调用函数以响应 javascript 中的轮子事件,但仅当对同一事件的上一个函数调用完成时
- reactjs - 不接受 this.setState 或 this.state 的外部函数
- docker-compose - redash 更改 nginx 端口
- carplay - 如何在 CarPlay for Audio App 中添加标签?
- xamarin - 自定义 ViewCell 包含按钮具有命令并绑定到此命令
- jquery - 仅使用字符串的一部分
- javascript - 如何定义CKEditor5双向转换器,视图定义为RegExp或函数?
- jenkins - 如何从詹金斯管道中的不同工作生成一份报告