有没有办法将数据传递给在 Simple Injector 中使用 Execution Context Scope 或 Lifetime Scope 注册的依赖项?
我的一个依赖项需要一段数据才能在依赖项链中构建。在 HTTP 和 WCF 请求期间,这些数据很容易获得。对于 HTTP 请求,数据始终存在于查询字符串中或作为Request.Form参数(因此可从 获取HttpContext.Current)。对于 WCF 请求,数据始终存在于OperationContext.Current.RequestContext.RequestMessageXML 中,并且可以被解析出来。我有许多命令处理程序实现,它们依赖于需要这条数据的接口实现,它们在 HTTP 和 WCF 范围的生活方式中运行良好。
现在我希望能够使用任务并行库执行这些命令中的一个或多个,以便它将在单独的线程中执行。将数据块移出到配置文件、类或任何其他静态工件中是不可行的。它最初必须通过 HTTP 或 WCF 传递给应用程序。
我知道如何使用 Simple Injector 创建一种混合生活方式,并且已经将其设置为混合 HTTP / WCF / 执行上下文范围(命令接口是异步的,并且返回Task而不是返回void)。我也知道如何创建一个命令处理程序装饰器,它将在需要时启动一个新的执行上下文范围。问题是,我不知道如何或在哪里(或者如果我可以)“保存”这段数据,以便在依赖链需要它来构建依赖项之一时可用。
可能吗?如果是这样,怎么做?
更新
目前,我有一个IProvideHostWebUri使用两个实现调用的接口:HttpHostWebUriProvider和WcfHostWebUriProvider. 界面和注册如下所示:
public interface IProvideHostWebUri
{
Uri HostWebUri { get; }
}
container.Register<IProvideHostWebUri>(() =>
{
if (HttpContext.Current != null)
return container.GetInstance<HttpHostWebUriProvider>();
if (OperationContext.Current != null)
return container.GetInstance<WcfHostWebUriProvider>();
throw new NotSupportedException(
"The IProvideHostWebUri service is currently only supported for HTTP and WCF requests.");
}, scopedLifestyle); // scopedLifestyle is the hybrid mentioned previously
所以最终,除非我采用这种方法,否则我的目标是创建该接口的第三个实现,然后依赖于某种上下文来获取 Uri(它只是从其他两个实现中的字符串构造的)。
@Steven 的答案似乎是我正在寻找的,但我不确定如何使ITenantContext实现不可变和线程安全。我认为它不需要一次性使用,因为它只包含一个Uri值。