我将我的ASP.NET多层项目迁移到ASP.NET Core。我在以前的项目中使用的是Ninject for DI,因此在我的BLL中可以这样称呼它。
public void IamMethodInBll()
{
...
//i could call ninject like this.
var prodCalcManager = Const.NinjectKernel.Get<IProdCalcService>();
prodSurr.CalculatedPrice = prodCalcManager.GetMyMethod()
..
}
现在我当然使用ASP Net Core的DI系统。但是,如何在业务层中为ASP.NET Core调用服务定位器?我需要您的样品和建议。
在Startup.cs
services.AddScoped<IProdCalcService,ProdCalcManager>();
在BLL中
public void IamMethodInBll()
{
...
//What's the proper way to call another service in BLL
//How can i get the service provider in BLL
var prodCalcManager = _serviceProvider.GetService<IProdCalcService>();
prodSurr.CalculatedPrice = prodCalcManager.GetMyMethod()
..
}
答案 0 :(得分:2)
正确的答案是:不要使用ServiceLocator。像以前一样使用@CrossOrigin
注册服务,然后将其添加到要在其中使用它的类的构造函数。
像这样:
services.AddScoped<T>
然后您的课程如下所示:
services.AddScoped<IProdCalcService,ProdCalcManager>();
答案 1 :(得分:1)
最好不要使用Service Locator,但在这种情况下,您可以将ServiceProvider注入到控制器中,或者更好的解决方案是将ServiceProvider包装并抽象到可以简单注入的容器中。 在这种情况下,我更喜欢使用第3方DI容器,特别是CastleCore是不错的选择。
public interface IContainer
{
T Resolve<T>();
}
public class ServiceProviderContainer : IContainer
{
private IServiceProvider _serviceProvider;
public ServiceProviderContainer(IServiceProvider serviceProvider)
{
this._serivceProvider = serviceProvider;
}
public T Resolve<T>()
{
return _seriveProvider.GetService<T>();
}
}
public class MyController : Controller
{
private IContainer contianer;
public MyController(IContainer container)
{
this._container = container;
}
public IActionResult Get()
{
var service = _container.Resolve<IUserRepository>();
}
}