【发布时间】:2026-02-05 04:50:02
【问题描述】:
我有一个使用 ASP.NET MVC 1.0 构建的网络。它使用 Structuremap 作为 IOC 容器。 如果我像这样在 Application_Start 上注册 IOC 部分,它会很好地工作:
ObjectFactory.Initialize(service =>
{
service.ForRequestedType<IOrderRepository>()
.TheDefaultIsConcreteType<OrderRepository>()
.CacheBy(InstanceScope.PerRequest);
});
我必须在 Windows 服务中使用相同的后端。
该服务中有一些计时器可以同时访问 OrderRepository,因此这里的线程是一个问题。
我的第一个想法是像这样在服务的构造函数中注册它:
public Service1()
{
ObjectFactory.Initialize(service =>
{
service.ForRequestedType<IOrderRepository>()
.TheDefaultIsConcreteType<OrderRepository>()
.CacheBy(InstanceScope.PerRequest);
});
}
这是缓存的正确位置和正确参数吗?
阅读documentation of Structuremap,我认为最安全的方法是使用默认设置进行缓存:
PerRequest - 默认操作。将为每个请求创建一个新实例。
我的印象是 PerRequest 的意思是 HttpContext,但那是另一个条目:
HttpContext - 将为每个 HttpContext 创建一个实例。缓存
HttpContext.Items集合中的实例。
【问题讨论】:
-
我认为您通常会在
OnStart中执行此类操作,不是吗?我想这可能会在一个实例上被多次调用,这是不可取的。
标签: .net windows-services inversion-of-control structuremap