我有一个使用 StructureMap 的 ASP.NET MVC 应用程序。
我创建了一个名为 SecurityContext 的服务,它具有静态 Current 属性。简化版本如下所示:
public class SecurityContext : ISecurityContext
{
public bool MyProperty { get; private set; }
public static SecurityContext Current
{
get
{
return new SecurityContext() { MyProperty = true };
}
}
}
我已将其连接到 StructureMap 注册表中,如下所示:
For<ISecurityContext>().Use(() => SecurityContext.Current);
我对 Use 方法的 Linq 表达式重载的理解是,返回的具体对象对于整个 HTTP 请求范围都是相同的。
但是,我设置了一个测试用例,其中我的上下文接口被注入到两个地方,一次在控制器的构造函数中,再次使用SetterProperty
我的视图继承的基类中的属性。
调试时我观察到Current
静态方法被击中两次,所以显然我的假设是错误的。谁能纠正我在这里所做的事情吗?我想要这个请求范围的原因是因为我正在将某些数据从数据库加载到我的上下文类中,所以我不希望这种情况对于给定的页面加载多次发生。
提前致谢。
配置的默认生命周期是瞬态的,因此对 ISecurityContext 的每个请求都将创建一个新的 SecurityContext 实例。我认为您想要的是使用旧的 HttpContext 生命周期。
包含 StructureMap.Web nuget 包。然后将您的配置更改为以下内容:
For<ISecurityContext>()
.Use(() => SecurityContext.Current)
.LifeCycleIs<HttpContextLifecycle>();
有关生命周期的更多信息可以找到here http://structuremap.github.io/object-lifecycle/supported-lifecycles/.
HttpContextLifecycle 已过时,但我不知道它是否或何时会被删除。 StructureMap 团队确实建议不要使用这个旧的 ASP.Net 生命周期。他们在文档中指出,大多数现代 Web 框架对每个请求使用嵌套容器来完成相同的范围。有关嵌套容器的信息可以找到here http://structuremap.github.io/the-container/nested-containers/.
我不知道您使用的 ASP.Net MVC 版本是否被视为现代 Web 框架。我怀疑这是因为 ASP.Net Core 1.0 是 ASP.Net 系列中第一个完全拥抱 DI 的版本。不过,在这一点上我会听从@jeremydmiller 的意见。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)