首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用ServiceCollection的DotNetCore2.0控制台应用程序中的循环依赖关系

使用ServiceCollection的DotNetCore2.0控制台应用程序中的循环依赖关系
EN

Stack Overflow用户
提问于 2017-11-04 23:30:01
回答 1查看 2.8K关注 0票数 0

我正在尝试使用DotNetCore2.0 Microsoft.Extensions.DependencyInjection nuget包附带的IServiceCollection来设置一个简单的依赖注入。我对它很陌生,所以我开始做一个小实验:

代码语言:javascript
运行
复制
public interface IService
{
}

public class JobService : IService
{
    public IService m_service { get; set; }
    public JobService(IService service)
    {
        m_service = service;
    }
}

class Program
{
    static void Main(string[] args)
    {
        IServiceCollection serviceCollection = new ServiceCollection();
        ConfigureService(serviceCollection);
        var serviceProvider = serviceCollection.BuildServiceProvider();
        //exception on next line
        var service = serviceProvider.GetService<App>();
        Console.WriteLine("Hello World!");
    }

    private static void ConfigureService(IServiceCollection serviceCollection)
    {
        serviceCollection.AddTransient<IService, JobService>();
        serviceCollection.AddTransient<App>();
    }
}

上面应该向容器注册所有类型,但是在运行时,我得到:

System.InvalidOperationException:“检测到”TestCore.IService“类型服务的循环依赖关系。”

在我的实现中没有看到循环依赖。有人能指出这个循环依赖的来源吗?

至于服务,它应该被注入到App中:

代码语言:javascript
运行
复制
public class App
{
    private IService m_service;
    public App(IService service)
    {
        m_service = service;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-04 23:41:16

由于循环依赖,依赖注入框架无法解决IService的依赖关系。这是因为IService (JobService)的实现本身依赖于IService的实现(即它本身)。不可能实例化JobService,因为它依赖于自身。DI框架认识到这一点,并抛出您正在看到的异常。为了避免这种情况,您需要使JobService依赖于不同接口的实现:

代码语言:javascript
运行
复制
public interface IService
{
}

public interface IAnotherService
{
}

public class JobService : IService
{
    public IAnotherService m_service { get; set; }
    public JobService(IAnotherService service)
    {
        m_service = service;
    }
}

public class AnotherService : IAnotherService
{
}

class Program
{
    static void Main(string[] args)
    {
        IServiceCollection serviceCollection = new ServiceCollection();
        ConfigureService(serviceCollection);
        var serviceProvider = serviceCollection.BuildServiceProvider();
        //exception on next line
        var service = serviceProvider.GetService<App>();
        Console.WriteLine("Hello World!");
    }

    private static void ConfigureService(IServiceCollection serviceCollection)
    {
        serviceCollection.AddTransient<IAnotherService, AnotherService>();
        serviceCollection.AddTransient<IService, JobService>();
        serviceCollection.AddTransient<App>();
    }
}

编辑/旁白:--如果您正在使用Autofac --您可以使用在JobService中保留IService依赖项,但是使用命名和键控服务提供不同的实现。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47116673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档