我有一个使用ASP.NET MVC 1.0构建的Web。它使用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
集合中的实例。
答案 0 :(得分:2)
根据这篇文章:http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase.aspx
可执行文件调用ServiceBase 派生类的构造函数 第一次在服务上调用Start 。 OnStart命令处理 在构造函数执行后立即调用方法。该 第一次服务后,构造函数不会再次执行 已加载,因此有必要分开执行的处理 由OnStart执行的构造函数。任何资源 可以在OnStart中创建OnStop。创建 构造函数中的资源可以防止它们被正确创建 如果在OnStop发布后再次启动该服务 资源。
听起来构造函数是第一次设置结构图的方法。
答案 1 :(得分:1)
说实话,这更像是一个“我的两分钱”贡献,实际上试图给出一个明确的答案,因为自从我开发Windows服务以来已经有一段时间了,但现在它已经开始了。
从ASP .Net MVC应用程序进行类比,其中容器的配置将在Global.asax类的Application_Start方法中进行,然后将配置的容器注入自定义的Controller Factory;我相信你可以,而不是在服务的构造函数中配置所有东西,尝试在可执行文件的Main函数中执行它,因为它只运行一次,然后将配置的容器注入服务的构造函数。
我认为通过这样做,您可以引导应用程序的所有Composition Root,并且服务中的代码将专注于执行它应该执行的操作。
就像我说已经有一段时间了,我从来没有使用过IoC容器或DI。祝你好运!