C# DI未将服务注入控制器

C# DI未将服务注入控制器,c#,asp.net-core,dependency-injection,interface,.net-core,C#,Asp.net Core,Dependency Injection,Interface,.net Core,我有一个奇怪的情况。我在startup类中注册我的服务,如下所示 public void ConfigureServices(IServiceCollection services) { ... services.AddSingleton<ISearchService, SearchService>(); services.AddSingleton<IBrandSearchService, BrandSearchService>(); se

我有一个奇怪的情况。我在startup类中注册我的服务,如下所示

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddSingleton<ISearchService, SearchService>();
    services.AddSingleton<IBrandSearchService, BrandSearchService>();
    services.AddSingleton<INearbySearchService, NearbySearchService>();
    services.AddSingleton<ILocationService, LocationService>();
    ...
}
public void配置服务(IServiceCollection服务)
{
...
services.AddSingleton();
services.AddSingleton();
services.AddSingleton();
services.AddSingleton();
...
}
但是,当我尝试在控制器的构造函数中访问它们时,它们为null,即使我将其添加到构造函数参数中,或者尝试从ServiceCollection获取

公共类SuggestController
{
只读ILocationService定位服务;
公共建议控制器(IOOptions设置、IOOptions访问、IStringLocalizer定位器、IMemoryCache memoryCache、IHostingEnvironment环境)
{
this.locationService=(ILocationService)new ServiceCollection().BuildServiceProvider().GetService(typeof(ILocationService));
}
}
实现ILocationService接口的My Location类

public class LocationService : ILocationService
{
    readonly ISolrOperations<LocationResult> search;

    ...

    public LocationService(ISolrOperations<LocationResult> search)
    {
        this.search = search;
    }

    ...
}
公共类定位服务:ILocationService
{
只读隔离搜索;
...
公共位置服务(隔离搜索)
{
this.search=搜索;
}
...
}

我遗漏了什么?

您没有注入您的服务。相反,您试图使用服务定位器反模式来获取它,但实际上并没有使用真正的服务集合。您正在创建一个新的服务集合,但没有注册所需的服务,并试图将您的服务从该集合中拉出,这当然会失败

尽管这无论如何都不是正确的方法,但要真正正确使用服务定位器反模式,您需要注入
IServiceProvider

public SuggestController(IServiceProvider provider, ...)
{
    this.locationService = provider.GetRequiredService<ILocationService>();
}

您正在创建一个全新的
ServiceCollection
实例,该实例为空,然后使用它尝试获取已在另一个
IServiceCollection
中注册的内容的实例。为什么不将
ILocationService
参数引入
SuggestController
构造函数中呢?我以前就是这么做的。如果我这样做,我会得到InvalidOperationException:在尝试激活“LocationService”时,无法解析类型“SolrNet.IsolarRoperations”“1[LocationResult]”的服务。这只是因为您没有向DI注册
IsolarRoperations
。@KirkLarkin可能是因为他没有跟上进度。这将是伟大的,如果你张贴它作为完整的答案。
public SuggestController(IServiceProvider provider, ...)
{
    this.locationService = provider.GetRequiredService<ILocationService>();
}
using (var scope = provider.CreateScope())
{
    var locationService = scope.ServiceProvider.GetRequiredService<ILocationService>();
}
public SuggestController(ILocationService locationService, ...)
{
    this.locationService = locationService;
}