IServiceProvider.GetService(Type serviceType) 的目的是啥?
Posted
技术标签:
【中文标题】IServiceProvider.GetService(Type serviceType) 的目的是啥?【英文标题】:What is the purpose of IServiceProvider.GetService(Type serviceType)?IServiceProvider.GetService(Type serviceType) 的目的是什么? 【发布时间】:2018-09-09 06:35:06 【问题描述】:我正在实施一个新的 .NET Core 项目并为我的服务层进行依赖注入。我创建了一个实现IServiceProvider
的接口,现在必须实现GetService(Type serviceType)
。这是我的界面。
public interface INewsService : IServiceProvider
IEnumerable<string> GetAllSources();
public class NewsService : INewsService
private readonly INewsRepository _newsRepository;
public NewsService(INewsRepository newsRepository)
_newsRepository = newsRepository;
public IEnumerable<string> GetAllSources()
return _newsRepository.GetAllSources();
public object GetService(Type serviceType)
throw new NotImplementedException();
该方法的目的是什么?通读MSDN documentation,确实很模糊,也没有搞清楚。我的代码在我启动时运行......所以我不确定它需要什么。
【问题讨论】:
为什么要实现IServiceProvider
?您的问题缺少一些上下文。
【参考方案1】:
获取指定类型的服务对象。
您不应在INewsService
接口上实现IServiceProvider
。
IServiceProvider
要求工厂创建您的服务实例:
IServiceProvider provider = GetServiceProvider();
var newsService = provider.GetService(typeof(INewsService));
了解更多关于服务提供商的信息:IServiceProvider in ASP.NET Core
【讨论】:
【参考方案2】:IServiceProvider
是实现 Microsoft.Extensions.DependencyInjection 的接口。一般来说,它是供 ASP.NET Core 内部使用的。
你应该做的是实现你自己的服务接口:
public interface ISomething
void DoSomething();
然后构建你自己的具体类型:
public class Something : ISomething
public void DoSomething()
// Implementation
然后您可以将其注册到 DI 容器中,例如:
public void ConfigureServices(IServiceCollection services)
services.AddMvc();
services.AddTransient<ISomething, Something>();
您可以在整个 ASP.NET Core 中使用您的服务,方法是接受它作为构造函数中的参数。例如,这是您在HomeController
中使用它的方式:
public class HomeController : Controller
private readonly ISomething something;
public HomeController(ISomething something)
this.something = something ?? throw new ArgumentNullException(nameof(something));
public IActionResult Index()
something.DoSomething();
return View();
IServiceProvider.GetService(Type)
在解析构造函数参数以从容器中获取您的服务时在内部调用(在此示例中实例化 HomeController
时)。在 ASP.NET Core 中使用依赖注入不需要实现 IServiceProvider
,只有在您想提供一些 DI 容器尚不具备的自定义功能时才需要实现它。
【讨论】:
您好,感谢您花时间输入回复。我的问题实际上只是关于 IServiceProvider,而不是一般的接口。【参考方案3】:我建议你看看这个答案:GetService() 如果你有很多服务来控制器
private readonly IMarkService _markService;
private readonly IModelService _modelService;
private readonly IModificationService _modificationService;
public CatalogController(IServiceProvider serviceProvider)
_markService = serviceProvider.GetService<IMarkService>();
_modelService = serviceProvider.GetService<IModelService>();
_modificationService = serviceProvider.GetService<IModificationService>();
【讨论】:
以上是关于IServiceProvider.GetService(Type serviceType) 的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章