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