当依赖项是循环的时,如何在Startup.cs中实现依赖项注入?

时间:2018-12-14 13:11:33

标签: c# dependency-injection .net-core circular-dependency

我有一个 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 项目的引用?

2 个答案:

答案 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
}