我正在实现一个新的.NET核心项目,并致力于我的服务层的依赖注入。我创建了一个实现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,它真的很模糊,也没有太多的清晰。我的代码在启动it...so时运行,我不确定它是用来做什么的。
发布于 2018-03-30 16:07:32
获取指定类型的服务对象。
您不应在INewsService接口上实现IServiceProvider。
IServiceProvider描述了用于创建服务实例的工厂:
IServiceProvider provider = GetServiceProvider();
var newsService = provider.GetService(typeof(INewsService));阅读有关服务提供商的更多信息:IServiceProvider in ASP.NET Core
发布于 2018-03-30 16:17:48
IServiceProvider是实现Microsoft.Extensions.DependencyInjection的接口。通常,它供ASP.NET核心内部使用。
你应该做的是实现你自己的服务接口:
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核心中使用您的服务,方法是将其作为构造函数中的参数接受。例如,下面是如何在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();
}
}当解析构造函数参数以从容器获取服务时(在本例中实例化HomeController时),将在内部调用IServiceProvider.GetService(Type)。通过ASP.NET核心使用依赖注入并不需要实现IServiceProvider,只有当您想要提供DI容器还没有的一些自定义功能时,才会实现它。
发布于 2020-05-14 07:00:03
我建议你看看这个答案: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>();
}https://stackoverflow.com/questions/49570686
复制相似问题