IServiceProvider.GetService(类型serviceType)的目的是什么?

时间:2018-03-30 08:01:11

标签: c# asp.net-core dependency-injection interface asp.net-core-2.0

我正在实现一个新的.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阅读,它真的很模糊,并没有太多清除它。我的代码在我启动时运行...所以我不确定它需要什么。

3 个答案:

答案 0 :(得分:3)

  

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

您不应在IServiceProvider界面上实施INewsService

IServiceProvider desribes factory来创建服务实例:

IServiceProvider provider = GetServiceProvider();
var newsService = provider.GetService(typeof(INewsService));

详细了解服务提供商:IServiceProvider in ASP.NET Core

答案 1 :(得分:1)

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。不需要实现IServiceProvider来使用ASP.NET Core的依赖注入,如果你想提供一些DI容器已经没有的自定义功能,你只能实现它。

答案 2 :(得分:0)

我建议您查看以下答案: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>();
    }
相关问题