Unity对象解决了Windows服务的最佳实践

时间:2013-03-05 14:43:14

标签: c# windows-services unity-container

我有一个Windows服务,它一直循环直到它停止。每个循环后有一个15秒的线程间隔。我正在使用Unity容器来解析一个对象,如下所示:

var processes = ProcessConfigurationSection.GetProcesses();
while (!_stopped)
{
    try
    {
        foreach (var process in processes)
        {
            var worker = new Worker(DiContainer.UnityContainer.Resolve<IProcessDao>());
            worker.RunProcess(process.Name, process.StoredProcedure, process.BatchSize);
        }
        Thread.Sleep(_interval);
    }
    catch (Exception ex)
    {
        Log.LogEvent(...);
    }
}

我应该在while循环中创建worker的实例(并解析对象),还是应该在while循环之外以获得性能优势?此外,这种方法中是否存在内存泄漏的可能性?

1 个答案:

答案 0 :(得分:1)

您通常应该为每个请求定义一个范围。对于Web应用程序,这通常是一个持续Web请求生命周期的范围。但是对于Windows服务应用程序,仍然有请求,只有您必须决定您所看到的请求。每个RunProcess调用可以是单个请求(因此是单个范围),也可以将整批processes视为单个请求。

您不应该在循环外定义此范围,因为范围生活方式通常会实现在整个请求中重用的工作单元实现。例如,Entity Framework的DbContext是一个工作单元。您不希望在应用程序的生命周期中重用相同的DbContext,因为当操作失败时,您可能会损坏DbContext,从而破坏整个应用程序。

使用Unity作用域使用子容器实现。您应该使用以下内容包装您的请求:

using (var child =
    DiContainer.UnityContainer.CreateChildContainer())
{
    var worker = new Worker(child.Resolve<IProcessDao>());
    worker.RunProcess(process.Name, process.StoredProcedure,
        process.BatchSize);
}

或许using (var child应该包裹foreach。这是你必须要做的事情。