如何设置StructureMap来解析Windows服务中的依赖项?

时间:2011-10-27 11:39:07

标签: .net windows-services inversion-of-control structuremap

我有一个使用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集合中的实例。

2 个答案:

答案 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。祝你好运!