问题标签 [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.
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
. 用户对象是一个几乎无处不在需要检查权限等的对象。
c# - 成员具有依赖关系的环境上下文
嗨,这可能只是缺乏想法,但我看不出如何“很好地”解决这个问题。我有一个组件负责在整个系统中使用的审计,例如:
接口在哪里AuditLogger
。就目前而言,我正在跨多个类使用构造函数注入(这个类列表正在增长)。所以我正在考虑实施Ambient Context。我遇到的问题是它RemoteAuditLogger
有自己的依赖项(在这种情况下是远程审计服务代理)。
所以我想要:
在这种情况下DefaultContext
将返回一个RemoteAuditLogger
. 有没有一种方法可以保留上下文的解耦性质,同时满足 的依赖关系RemoteLogger
?例如,我不想SomeContext
依赖远程审计代理,所以它“感觉”就像我需要在DefaultContext
.
asp.net-mvc-4 - MessageProvider 使用什么依赖注入模式?
我有一个 ContactController ,我在其中设置了一条消息TempData
(这是在成功提交后在屏幕上显示一条消息),并且在布局中,有一个部分_Message.cshtml
应该呈现消息(如果有)。下面的方法签名:
最初我考虑MessageProvider
在构造函数中注入一个依赖项。但后来我突然想到:如果我需要在其他控制器中执行此操作怎么办?此外,为了让我在局部视图中使用它,我需要从容器中解析实现,我认为这是在扩展类中使用的可接受的解决方案WebViewPage
(考虑到我不打算对其进行单元测试)。
但是我们可以使用另一种依赖注入模式来避免Service Locator
反模式吗?
我认为这有一个很好的默认实现,并且由于我们将来可能需要在更多控制器中使用它,根据 Mark Seemann 的 .NET 中的依赖注入MessageProvider
一书,这可能是Ambient Context
设计模式的一个很好的候选者。
这样,我将消除将来必须更改其他控制器构造函数的潜在问题,以防我碰巧必须在其中设置消息,我将消除Service Locator
在构造函数中使用反模式的需要,MyCustomViewPage
并且我的控制器仍将可测试。
然后我会在部分视图中使用以下代码:
我的控制器中的以下代码:
在我的测试装置中(如果我真的需要另一个实现):
您认为这种方法有意义吗?我可能遗漏的任何缺点?
c# - 应该使用哪个 WCF 的扩展点来为每个操作设置上下文?
我想为主机内运行的所有服务的每个操作设置环境上下文(类似于 Thread.CurrentPrincipal 的工作方式)。
我应该使用什么扩展机制?它们很多,所以我很困惑,因为我几乎没有使用 WCF 的经验。
c# - AsyncLocal 和 CallContext - 如何同时实现异步 * 和 * 远程逻辑上下文保证?
我正在尝试开发一个实现松散定义的环境上下文模式的库。我需要同时考虑高度并行性和远程处理 ( .NET Framework 4.6.2
)。看来我有 2 个选项可用:AsyncLocal<T>
和CallContext
. 我不相信两者都满足这两个考虑。
考虑以下示例,该示例演示了我的问题的远程处理部分:
此类创建两个 GUID,一个存储在异步本地,另一个存储在逻辑调用上下文中。然后它启动一个新的 AppDomain,并打印来自当前和远程域的值。
该程序的示例输出显示
我们可以看到 CallContext 跨越了远程边界,而 AsyncLocal 没有(并不奇怪)。
问题在于,由于 CallContext 跨线程共享的方式,我不相信我可以在“简单并行”环境中利用 CallContext(正如Stephen Cleary 在这篇文章中所阐述的那样)。Stephen 在链接解决方案中有一个出色的伪代码示例,我不会在此重复。该示例概述了我的问题的异步部分。
然后我的两个选择变成
AsyncLocal<T>
:在“简单并行”环境中工作,但无法跨越远程边界。
CallContext
:跨远程边界工作,但在“简单并行”环境中失败。
我错过了第三种选择吗?
c# - 使用通用 IHostBuilder 时访问 IServiceProvider
我IHostBuilder
在 .NET Core 2.1 控制台应用程序中使用。主要看起来像这样:
之前,IWebHostBuilder
我有Configure()
让我这样做的方法:
这让我可以注册一些环境(使用环境上下文模式),而不是应用程序的主要依赖关系图的一部分。(如您所见,我仍然使用容器来实例化它,这当然比手动更新它更可取。我们可以将其视为辅助的环境依赖图。)
使用通用主机构建器,我们似乎永远无法访问已构建IServiceProvider
的或IApplicationBuilder
. 在这种情况下如何实现相同的注册?