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) 的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章