【问题标题】: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?您的问题缺少一些上下文。

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


【解决方案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>();
        }
    

    【讨论】:

      猜你喜欢
      • 2013-09-04
      • 2013-01-29
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      • 2019-02-16
      • 2021-04-15
      相关资源
      最近更新 更多