首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重构过多传递的上下文?

如何重构过多传递的上下文?
EN

Stack Overflow用户
提问于 2018-03-29 20:02:01
回答 1查看 88关注 0票数 0

我有一个类,它存储有关当前操作的上下文的信息。例如,每个操作都属于某个操作块,因此出于日志记录(和许多其他目的)的目的,我传递了该类的实例,该实例存储了它是哪个操作块:

代码语言:javascript
复制
ExecuteAction(action,context);

这让我可以记录如下内容:

代码语言:javascript
复制
var logString = $"action{action.Name} was executed as part of {context.ActionBlockName} action block";

能够获得当前动作块是非常重要的,因为相同的动作在不同的动作块中执行,并且在任何给定的时间都可以有任意数量的活动上下文。

然而,我的代码相当复杂,有数千个方法调用层叠在一起,我经常不得不在5-6个不同的方法调用中形成日志字符串,这意味着这个context只是被传递了太多,并且在大多数方法签名中。

我在考虑将所有上下文信息写入文件或数据库,以供所有方法访问,但它们仍然必须在所有活动上下文中找到当前上下文。这意味着我将不得不传递某种上下文关键字,这并不比传递上下文本身更好。

有没有更好的方法来做这件事?

理想情况下,我需要的结果是能够在不在action中存储任何上下文信息的情况下调用ExecuteAction(action);,同时能够以某种方式找出ExecuteAction中的上下文

EN

回答 1

Stack Overflow用户

发布于 2018-03-29 20:21:41

有几种方法浮现在脑海中:

1) 依赖注入:最近几年流行使用依赖注入容器来帮助实现这一点。这个想法是创建你的上下文对象,然后用DI容器注册一个对象以获得对它的访问,可能是像CurrentContextAccessor这样的东西,上面有一个GetCurrent方法。该方法将包含知道哪个上下文对象是“当前上下文对象”的逻辑。然后,需要访问此上下文的所有对象都将注册到DI容器,并将CurrentContextAccessor对象指定为构造函数参数,以便当您从DI容器获取此类对象时,它会自动通过构造函数将CurrentContextAccessor对象注入其中,以便它可以访问当前上下文。

ASP.NET核心就是基于这种方法构建的系统的一个例子。这种方法的优点之一是,只有你的对象的构造函数方法需要传入CurrentContextAccessor,它的方法都不需要它,因为它们可以通过构造函数存储当前上下文的成员变量在内部访问上下文。而且您不必专门将CurrentContextAccessor传递给您向DI容器注册的任何对象,因为当从DI容器请求对象时,它将自动注入到该对象中。这种方法的另一个优点是它导致了松散耦合的代码,这些代码应该很容易进行单元测试。这种方法的缺点之一是,DI容器和以这种方式使用它们可以为需要维护代码的开发人员创建一条学习曲线,有些人会争辩说,它使程序中的控制流更难遵循。

2) 全局静态访问器:您可以创建一个挂起某个全局可访问类的静态方法,以提供对当前上下文的访问。这具有比第一种方法更容易实现的优点,并且更容易让初级开发人员遵循代码中的控制流程。但它将所有类紧密耦合到is全局静态变量,这使得在其他项目中重用您的类变得更加困难,并且使得在使用全局静态上下文访问器的代码上运行单元测试变得非常困难。ASP.NET完整的框架提供了HttpContext.Current,它就是这种方法的一个例子。

还有其他方法,如Service Locator模式(您可以通过google搜索),但它通常仍然使用DI容器(尽管它不是必须的),并且仍然使对象难以进行单元测试。因此,你可以从上面列出的两种方法中得到缺点,除非你想出一个真正简洁的实现。

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

https://stackoverflow.com/questions/49555533

复制
相关文章

相似问题

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