C# Unity对象解析windows服务的最佳实践
我有一个windows服务,它一直循环,直到停止。每个循环后有15秒的线程间隔。我正在使用unity容器解析一个对象,如下所示:C# Unity对象解析windows服务的最佳实践,c#,windows-services,unity-container,C#,Windows Services,Unity Container,我有一个windows服务,它一直循环,直到停止。每个循环后有15秒的线程间隔。我正在使用unity容器解析一个对象,如下所示: var processes = ProcessConfigurationSection.GetProcesses(); while (!_stopped) { try { foreach (var process in processes) { var worker = new Worker(Di
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(...);
}
}
var processes=ProcessConfigurationSection.getProcesss();
而(!\u停止)
{
尝试
{
foreach(过程中的var过程)
{
var worker=新的worker(DiContainer.UnityContainer.Resolve());
worker.RunProcess(process.Name、process.StoredProcedure、process.BatchSize);
}
线程。睡眠(_间隔);
}
捕获(例外情况除外)
{
LogEvent(…);
}
}
我应该在while循环内创建一个worker实例(并解析对象),还是应该在while循环外创建一个worker实例以提高性能?另外,这两种方法都有可能出现内存泄漏吗?您通常应该定义“每个请求”的作用域。对于web应用程序,这通常是一个在web请求的生命周期内持续的作用域。对于Windows服务应用程序,尽管仍有请求,但您只需决定将什么视为请求。每个
RunProcess
调用都可以是单个请求(因此是单个作用域),或者处理整个进程的过程可以看作是单个请求
您不应该在循环之外定义这个范围,因为范围化的生活方式通常会实现一些东西,比如在整个请求中重用的工作单元实现。例如,实体框架的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);
}
使用(var-child)=
DiContainer.UnityContainer.CreateChildContainer())
{
var-worker=新的worker(child.Resolve());
worker.RunProcess(process.Name、process.StoredProcedure、,
过程(批量大小);
}
或者,使用(var child
应该包装foreach
。这是您必须决定的。您通常应该定义“每个请求”的作用域。对于web应用程序,这通常是一个在web请求的生命周期内持续的作用域。对于Windows服务应用程序,尽管仍有请求,但您只需要决定什么您可以将其视为请求。每个RunProcess
调用可以是单个请求(因此是单个作用域),或者处理整个进程的过程可以视为单个请求
您不应该在循环之外定义此范围,因为范围化的生活方式通常会实现在整个请求中重用的工作单元实现。例如,实体框架的DbContext
是一个工作单元。您不希望在appl的生命周期中重用相同的DbContext
因为当操作失败时,可能会损坏DbContext
,从而损坏整个应用程序
With Unity作用域是使用子容器实现的。您应该使用以下内容包装您的请求:
using (var child =
DiContainer.UnityContainer.CreateChildContainer())
{
var worker = new Worker(child.Resolve<IProcessDao>());
worker.RunProcess(process.Name, process.StoredProcedure,
process.BatchSize);
}
使用(var-child)=
DiContainer.UnityContainer.CreateChildContainer())
{
var-worker=新的worker(child.Resolve());
worker.RunProcess(process.Name、process.StoredProcedure、,
过程(批量大小);
}
或者,使用(var child
应该包装foreach
。这是您必须决定的。什么是IProcessDao
的生存期管理是应用程序的一个实例、每个线程一个实例还是每个解析一个新实例?ProcessDao将是每个解析的一个新实例。如果是,您不能将其移出for循环需要每次都创建一个新实例。对不起,我理解错了,ProcessDao可以作为应用程序的一个实例重用。什么是IProcessDao
的生存期管理是应用程序的一个实例、每个线程一个实例还是每个解析一个新实例?ProcessDao将是每个解析的一个新实例如果每次都需要创建一个新实例,则不能将其移出for循环。对不起,我理解错了,ProcessDao可以作为应用程序的一个实例重用。