C# DI未将服务注入控制器
我有一个奇怪的情况。我在startup类中注册我的服务,如下所示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
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;
}