AspNet Core: как получить текущий объект контроллера в сервисе - PullRequest
0 голосов
/ 09 октября 2018

Я создал проект .NetCore 2.1 и у меня есть базовый класс контроллеров, подобный этому

public class MyBaseController:Controller
{
    #region Properties

    protected readonly ILogger Logger;
    protected readonly VVDCCore.Tools.Interfaces.IResourceManager Resx; 

    protected IDictionary<string,string> ExtraParameters;

    #endregion

    #region CONSTRUCTOR

    public BaseController(ILogger<BaseController> logger,
        VVDCCore.Tools.Interfaces.IResourceManager resxManager)
    {
        Logger = logger;
        Resx = resxManager;
    }

    #endregion
}

Все мои контроллеры являются дочерними для этого базового класса.

У меня есть служба (ResourceServices, котораяреализует интерфейс IResourceManager), который позволяет получать значение в зависимости от ключа и контекста.

Я знаю, как получить доступ к имени контроллера и имени действия в службе благодаря интерфейсу IActionContextAccessor.Но я хотел бы получить текущий объект контроллера.В сервисе мне нужно получить доступ к свойству ExtraParameters из моего baseController, но я не знаю, как это сделать

Подводя итог, я хотел бы сделать что-то вроде

public class ResourcesServices{

    public ResourceServices([CurrentController] controller)
    {
        var extraParameters = ((MyBaseController)controller).ExtraParameters;
    }
}

Любойпуть к этому?ТИА

1 Ответ

0 голосов
/ 09 октября 2018

Не ссылаться на объект контроллера на другие классы.
Вместо этого указывайте только информацию, которая требуется для класса.

public class ResourcesServices
{
    public ResourceServices(IDictionary<string, string> parameters)
    {
        var extraParameters = parameters;
    }
}

Если вы используете Dependency Injection и ExtraParameters известны только во время выполнения (ResourcesServices экземпляр не может быть создан).
Затем рассмотрите возможность передачи параметров методу ResourcesServices, который будет их использовать.

public class ResourcesServices
{        
    public ResourceServices() { }

    public void DoSomething(IDictionary<string, string> parameters)
    {
        var extraParameters = parameters;
    }
}

Когда класс ResourceServices требует предоставления «ExtraParameters»в конструкторе вы можете создать фабричный класс, который будет отвечать за создание правильного экземпляра ResourceServices со значениями времени выполнения.

public class ResourcesServicesFactory
{        
    public ResourcesServicesFactory() { }

    public ResourcesServices Create(IDictionary<string, string> parameters)
    {
        return new ResourcesServices(parameters);
    }
}   

public class ChildController : MyBaseController
{
    private readonly ResourceServiceFactory _factory;


    public ChildController(  
        ILogger<BaseController> logger,
        VVDCCore.Tools.Interfaces.IResourceManager resxManager,
        ResourceServiceFactory factory) : base(logger, resxManager)
    {
        _factory = factory;
    }

    public IActionResult Get()
    {
        var service = _factory.Create(ExtraParameters);
        service.DoSomething();
    }
}

Рассматривайте контроллер как точку входа вашего приложения, основная ответственность которого передается через «ввод»в службу и вернуть вывод клиенту.

...