Перенос многослойного приложения ASP.NET в ядро ​​ASP.NET - PullRequest
1 голос
/ 12 июня 2019

Я перенес многослойный проект ASP.NET в ASP.NET Core.Я использовал Ninject для DI в моем старом проекте, и я мог назвать его следующим образом в моем BLL.

public void  IamMethodInBll()
{
    ...
    //i could call ninject like this.
    var prodCalcManager = Const.NinjectKernel.Get<IProdCalcService>();
    prodSurr.CalculatedPrice = prodCalcManager.GetMyMethod()
    ..
}

В настоящее время я, конечно, использую систему DI ASP Net Core.Но как я могу вызвать сервисный локатор на бизнес-уровне для ядра ASP.NET?Мне нужны ваши образцы и предложения.

В 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 ]

2 голосов
/ 12 июня 2019

Правильный ответ: не используйте ServiceLocator.Зарегистрируйте свои службы, используя services.AddScoped<T>, как вы, а затем добавьте это в конструктор класса, в котором вы хотите его использовать.

Примерно так:

services.AddScoped<IProdCalcService,ProdCalcManager>();

Тогда ваш класс выглядиткак это:

public class MyClass()
{

    private IProdCalcService calcService;

    public MyClass(IProdCalcService calcService)
    {
        this.calcService = calcService;
    }

    public void IamMethodInBll()
    {

        //...

        prodSurr.CalculatedPrice = calcService.GetMyMethod();

        //...
    }
}
1 голос
/ 12 июня 2019

Лучше НЕ ИСПОЛЬЗОВАТЬ Сервисный Локатор, но в этом случае вы можете внедрить ServiceProvider в свой Контроллер, или лучшее решение - это обернуть и абстрагировать ServiceProvider в Контейнер, который может быть просто введен.Я предпочитаю использовать сторонние 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>();
  }
}
...