问题标签 [ambientcontext]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
3238 浏览

c# - 使用静态工厂 Func 为 ASP.NET 应用程序创建“环境上下文”(UserContext)

我发现几乎每个类(控制器、视图、HTML 助手、服务等)都需要当前登录的用户数据。所以我考虑创建一个“环境上下文”而不是直接注入 IUserService 或用户。

我的方法看起来像这样。

示例用法:

我的方法是正确的还是我遗漏了什么?您有更好的解决方案吗?

更新:

用户类的更多细节:

控制器中,我们需要检查用户是否是超级用户,以便只为超级用户提供一些额外的功能。

视图中,我们检查操作以仅在用户有权这样做时显示编辑或删除按钮。视图从不使用 DependencyResolver,而是使用 ViewBag 或 ViewModel。我的想法是实现一个自定义 ViewBasePage 并提供一个 ActiveUser 属性,以便视图可以轻松访问。

HtmlHelpers中,我们根据 IsSuperUser 和 Operations 渲染控件(传入 User 对象或使用 DependencyResolver)。

服务类中,我们也需要这些属性。例如,决定一个购物篮是否有效(检查是否允许用户购买不在标准列表中的物品)。所以 Service 类依赖IUserService并调用GetUser().

Action Filters中强制用户更改他的密码(仅当它不是 SuperUser 并且 User.ForcePasswordChange 为 true 时)。这里我们使用 DependencyResolver。

我希望有一种更简单的方法来获取 User 对象,而不是使用 DependencyResolver.Current.GetService().GetUser() 或使用ViewBag.ActiveUser = User. 用户对象是一个几乎无处不在需要检查权限等的对象。

0 投票
0 回答
477 浏览

c# - 成员具有依赖关系的环境上下文

嗨,这可能只是缺乏想法,但我看不出如何“很好地”解决这个问题。我有一个组件负责在整个系统中使用的审计,例如:

接口在哪里AuditLogger。就目前而言,我正在跨多个类使用构造函数注入(这个类列表正在增长)。所以我正在考虑实施Ambient Context。我遇到的问题是它RemoteAuditLogger有自己的依赖项(在这种情况下是远程审计服务代理)。

所以我想要:

在这种情况下DefaultContext将返回一个RemoteAuditLogger. 有没有一种方法可以保留上下文的解耦性质,同时满足 的依赖关系RemoteLogger?例如,我不想SomeContext依赖远程审计代理,所以它“感觉”就像我需要在DefaultContext.

0 投票
1 回答
47 浏览

asp.net-mvc-4 - MessageProvider 使用什么依赖注入模式?

我有一个 ContactController ,我在其中设置了一条消息TempData(这是在成功提交后在屏幕上显示一条消息),并且在布局中,有一个部分_Message.cshtml应该呈现消息(如果有)。下面的方法签名:

最初我考虑MessageProvider在构造函数中注入一个依赖项。但后来我突然想到:如果我需要在其他控制器中执行此操作怎么办?此外,为了让我在局部视图中使用它,我需要从容器中解析实现,我认为这是在扩展类中使用的可接受的解决方案WebViewPage(考虑到我不打算对其进行单元测试)。

但是我们可以使用另一种依赖注入模式来避免Service Locator反模式吗?

我认为这有一个很好的默认实现,并且由于我们将来可能需要在更多控制器中使用它,根据 Mark Seemann 的 .NET 中的依赖注入MessageProvider一书,这可能是Ambient Context设计模式的一个很好的候选者。

这样,我将消除将来必须更改其他控制器构造函数的潜在问题,以防我碰巧必须在其中设置消息,我将消除Service Locator在构造函数中使用反模式的需要,MyCustomViewPage并且我的控制器仍将可测试。

然后我会在部分视图中使用以下代码:

我的控制器中的以下代码:

在我的测试装置中(如果我真的需要另一个实现):

您认为这种方法有意义吗?我可能遗漏的任何缺点?

0 投票
1 回答
277 浏览

c# - 应该使用哪个 WCF 的扩展点来为每个操作设置上下文?

我想为主机内运行的所有服务的每个操作设置环境上下文(类似于 Thread.CurrentPrincipal 的工作方式)。

我应该使用什么扩展机制?它们很多,所以我很困惑,因为我几乎没有使用 WCF 的经验。

0 投票
0 回答
466 浏览

c# - AsyncLocal 和 CallContext - 如何同时实现异步 * 和 * 远程逻辑上下文保证?

我正在尝试开发一个实现松散定义的环境上下文模式的库。我需要同时考虑高度并行性远程处理 ( .NET Framework 4.6.2)。看来我有 2 个选项可用:AsyncLocal<T>CallContext. 我不相信两者都满足这两个考虑。

考虑以下示例,该示例演示了我的问题的远程处理部分:

此类创建两个 GUID,一个存储在异步本地,另一个存储在逻辑调用上下文中。然后它启动一个新的 AppDomain,并打印来自当前和远程域的值。

该程序的示例输出显示

我们可以看到 CallContext 跨越了远程边界,而 AsyncLocal 没有(并不奇怪)。

问题在于,由于 CallContext 跨线程共享的方式,我不相信我可以在“简单并行”环境中利用 CallContext(正如Stephen Cleary 在这篇文章中所阐述的那样)。Stephen 在链接解决方案中有一个出色的伪代码示例,我不会在此重复。该示例概述了我的问题的异步部分。

然后我的两个选择变成

AsyncLocal<T>:在“简单并行”环境中工作,但无法跨越远程边界。

CallContext:跨远程边界工作,但在“简单并行”环境中失败。

我错过了第三种选择吗?

0 投票
1 回答
2185 浏览

c# - 使用通用 IHostBuilder 时访问 IServiceProvider

IHostBuilder在 .NET Core 2.1 控制台应用程序中使用。主要看起来像这样:

之前,IWebHostBuilder我有Configure()让我这样做的方法:

这让我可以注册一些环境(使用环境上下文模式),而不是应用程序的主要依赖关系图的一部分。(如您所见,我仍然使用容器来实例化它,这当然比手动更新它更可取。我们可以将其视为辅助的环境依赖图。)

使用通用主机构建器,我们似乎永远无法访问已构建IServiceProvider的或IApplicationBuilder. 在这种情况下如何实现相同的注册?