首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AspNet核心:如何在服务中获取当前控制器对象

AspNet核心:如何在服务中获取当前控制器对象
EN

Stack Overflow用户
提问于 2018-10-09 10:06:09
回答 1查看 1.9K关注 0票数 1

我构建了一个.NetCore 2.1项目,并有一个如下所示的基控制器类

代码语言:javascript
复制
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,但不知道如何做到这一点

总之,我想做这样的事情

代码语言:javascript
复制
public class ResourcesServices{

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

有什么办法吗?提亚

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-09 10:10:52

不要将控制器对象引用到其他类。

相反,只提供所需的信息类。

代码语言:javascript
复制
public class ResourcesServices
{
    public ResourceServices(IDictionary<string, string> parameters)
    {
        var extraParameters = parameters;
    }
}

如果您使用的是依赖注入,并且ExtraParameters只在运行时才知道(ResourcesServices实例不能实例化)。

然后考虑将参数传递给使用参数的ResourcesServices方法。

代码语言:javascript
复制
public class ResourcesServices
{        
    public ResourceServices() { }

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

ResourceServices类要求在构造函数中提供"ExtraParameters“时,可以创建工厂类,它将负责创建具有运行时值的ResourceServices的适当实例。

代码语言:javascript
复制
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();
    }
}

将控制器作为应用程序的入口点,主要责任是将“输入”传递给服务,并将输出返回给客户端。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52718392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档