添加接口时,依赖注入不起作用

时间:2018-02-13 16:54:34

标签: c# asp.net dependency-injection singleton

当我在我的启动类

中向configure服务方法添加服务时
services.AddSingleton<IGoogleApi, GoogleApi>();

我收到以下错误。

  

Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware [0]         执行请求时发生了未处理的异常   System.InvalidOperationException:尝试激活'MultilanguageTranslatorAPI.Controllers.WordsController'时,无法解析类型'MultilanguageTranslatorAPI.Services.GoogleApi'的服务。

如果我将其更改为(已删除的界面)

services.AddSingleton<GoogleApi, GoogleApi>();

错误消失了,一切正常。但为什么?我班上有什么问题?构造函数可能是可疑的。

public WordsController(TranslatorDbContext context, UserManager<User> userManager, GoogleApi api)
    {
        _userManager = userManager;
        _context = context;
        _api = api;
    }

public class GoogleApi : IGoogleApi
{
    private readonly TranslationClient _client;
    private readonly string jsonPath = "Json\\MultilanguageTranslator-82ea38c537d3.json";

    public GoogleApi()
    {
        using (var jsonStream = new FileStream(jsonPath, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            _client = TranslationClient
                .Create(GoogleCredential.FromStream(jsonStream));
        }
    }

应该如何查看此实施的正确代码? 在此先感谢: - )

1 个答案:

答案 0 :(得分:4)

您的控制器正在此处使用其中的具体类型GoogleApi

public WordsController(TranslatorDbContext context, UserManager<User> userManager, GoogleApi api)

它应该采用类型IGoogleApi,如下所示:

public WordsController(TranslatorDbContext context, UserManager<User> userManager, IGoogleApi api)

当您使用具体类型时,IOC容器无法使用IGoogleApiGoogleApi的单例映射,因为它不是类型要求的依赖性。