【发布时间】:2014-08-22 05:14:45
【问题描述】:
我有一个托管 WCF 服务的 Windows 服务,并且我能够使用 WCFTestClient 和自定义客户端成功连接到它。 Windows 服务基于以前的 exe,但由于该程序将用于服务器上长时间运行的进程,因此该服务是更好的途径。问题是我无法从 WCF 服务访问应用程序中的静态变量。
在 .exe 中(我将其切换为作为服务器应用程序的 .dll)我使用了一个这样实现的全局类:
public static class Globals
{
....
}
这包含对程序主要部分的引用,因此如果任何部分需要引用另一个部分,我可以使用语法Globals.JobManager.RunJob()。
我遇到的问题是 WCF 服务无法在运行时引用 Globals。我需要这样做的一个例子是在 GetJob 方法中:
public class ConsoleConnection : IConsoleConnection
{
public string[] RetrieveJobList()
{
string[] jobs = Globals.JobManager.GetAllJobNames().ToArray();
return jobs;
}
}
此方法在 WCFTestClient 中测试时返回 null,并在创建的客户端中引发异常。
我认为这个问题是由 Windows 服务、WCF 服务和应用程序 DLL 的启动方式引起的。目前的方法是这样的:
public class ETLWindowsService : ServiceBase
{
....
protected override void OnStart(string[] args)
{
if (serviceHost != null)
{
serviceHost.Close();
}
Globals.InitializeGlobals();
serviceHost = new ServiceHost(typeof(ConsoleConnection));
serviceHost.Open();
}
....
}
Windows 服务在这里启动,调用 Globals.InitializeGlobals() 创建应用程序的所有必要部分,然后启动 WCF 服务(如果这是错误的方法,请告诉我。我正在拼凑这个当我走的时候)。我假设这些操作的执行顺序错误,这就是问题的原因。
我需要让 Windows 服务创建 WCF 服务,然后再创建应用程序(这对我来说没有意义),还是让 Windows 服务创建应用程序,然后创建 WCF 服务?还是我缺少第三种选择?
应用程序位于 .dll 中,而 WCF 位于单独的 .dll 中
【问题讨论】:
-
似乎设计问题和实现问题在这里混合在一起。顺便说一句,使用静态看起来像是设计气味的第一个迹象。