我有一个 MyProject 项目,其中有IMyService
接口和实现MyService
的{{1}}类。在Startup.cs类中,我依赖注入它们:
IMyService
因为// MyProject project | Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IMyService, MyService>();
}
有很多依赖关系(对第三方进行了许多REST调用等),所以我想为开发环境创建一个存根版本。我创建了新的 MyStubsProject ,它引用了 MyProject 。然后,我将MyService
的存根版本实现为 MyStubsProject :
IMyService
所以现在我想向Startup.cs类添加依赖项注入:
// MyStubsProject project
public class MyStubService : IMyService
{
...
}
但是,如果我加上这一点,则 MyProject 和 MyStubsProject 之间将存在循环依赖关系。
我应该如何在Startup.cs中实现对类// MyProject project | Startup.cs
public void ConfigureServices(IServiceCollection services)
{
if (isDevelopmentEnvironment)
services.AddScoped<IMyService, MyStubService>();
else
services.AddScoped<IMyService, MyService>();
}
或 MyStubsProject 项目的引用?
答案 0 :(得分:7)
最好的答案可能是将您的服务内容提取到一个单独的项目中-至少是服务合同(IMyService
)。那应该让您现有的两个项目都引用服务合同而没有任何冲突。如果要添加其他接口,或添加同一接口的其他实现,现在也将很容易。
另一个好处可能是更好的总体体系结构:将合同保存在不包含实际逻辑(仅包含接口)的单独项目中,通常会导致组织得更好,代码更简洁。
答案 1 :(得分:1)
您可以使用预编译器指令#if来确定您的项目是设置为调试还是发布。编译器将完成其余工作!
// MyProject project | Startup.cs
public void ConfigureServices(IServiceCollection services)
{
#IF DEBUG
services.AddScoped<IMyService, MyStubService>();
#ELSE
services.AddScoped<IMyService, MyService>();
#ENDIF
}