将ASP.NET多层应用程序迁移到ASP.NET Core

时间:2019-06-12 11:37:48

标签: c# asp.net-mvc asp.net-core dependency-injection ninject.web.mvc

我将我的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()
    ..
}

2 个答案:

答案 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>();
  }
}