首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IServiceProvider.GetService(serviceType类型)有何用途?

IServiceProvider.GetService(serviceType类型)有何用途?
EN

Stack Overflow用户
提问于 2018-03-30 16:01:11
回答 3查看 14.7K关注 0票数 5

我正在实现一个新的.NET核心项目,并致力于我的服务层的依赖注入。我创建了一个实现IServiceProvider的接口,现在必须实现GetService(Type serviceType)。这是我的界面。

代码语言:javascript
运行
复制
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,它真的很模糊,也没有太多的清晰。我的代码在启动it...so时运行,我不确定它是用来做什么的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-03-30 16:07:32

获取指定类型的服务对象。

您不应在INewsService接口上实现IServiceProvider

IServiceProvider描述了用于创建服务实例的工厂:

代码语言:javascript
运行
复制
IServiceProvider provider = GetServiceProvider();
var newsService = provider.GetService(typeof(INewsService));

阅读有关服务提供商的更多信息:IServiceProvider in ASP.NET Core

票数 9
EN

Stack Overflow用户

发布于 2018-03-30 16:17:48

IServiceProvider是实现Microsoft.Extensions.DependencyInjection的接口。通常,它供ASP.NET核心内部使用。

你应该做的是实现你自己的服务接口:

代码语言:javascript
运行
复制
public interface ISomething
{
    void DoSomething();
}

然后构建您自己的具体类型:

代码语言:javascript
运行
复制
public class Something : ISomething
{
    public void DoSomething()
    {
        // Implementation
    }
}

然后将其注册到DI容器中,如下所示:

代码语言:javascript
运行
复制
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    services.AddTransient<ISomething, Something>();
}

您可以在整个ASP.NET核心中使用您的服务,方法是将其作为构造函数中的参数接受。例如,下面是如何在HomeController中使用它

代码语言:javascript
运行
复制
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();
    }
}

当解析构造函数参数以从容器获取服务时(在本例中实例化HomeController时),将在内部调用IServiceProvider.GetService(Type)。通过ASP.NET核心使用依赖注入并不需要实现IServiceProvider,只有当您想要提供DI容器还没有的一些自定义功能时,才会实现它。

票数 4
EN

Stack Overflow用户

发布于 2020-05-14 07:00:03

我建议你看看这个答案:GetService(),如果你有很多服务,就去找控制器

代码语言:javascript
运行
复制
    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>();
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49570686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档