首页 > 解决方案 > 当依赖是循环的时,如何在 Startup.cs 中实现依赖注入?

问题描述

我有一个MyProject项目,其中我有实现的IMyService接口和MyServiceIMyService。在 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>();
}

但是如果我添加它, MyProjectMyStubsProject之间将存在循环依赖关系。

我应该如何在 Startup.cs 中实现对类MyStubServiceMyStubsProject项目的引用?

标签: c#dependency-injection.net-corecircular-dependency

解决方案


最好的答案可能是将您的服务内容提取到一个单独的项目中,或者至少是服务合同(IMyService)。这应该让您现有的两个项目都引用服务合同而没有任何冲突。如果您想添加其他接口或添加同一接口的更多实现,现在这也很容易。

另一个好处可能是更好的整体架构:将合约保存在没有任何实际逻辑(仅接口)的单独项目中通常会产生更好的组织和更清晰的代码。


推荐阅读