【发布时间】:2010-01-08 11:36:18
【问题描述】:
在为我的基于服务器的应用程序考虑了一些架构问题后,我觉得我将不得不使用单例来实现我的目标。纯粹出于以下原因(证明我的气味是合理的):
- 我不需要将昂贵的对象深入到调用堆栈中
- 我可以在任何上下文中对单例管理对象执行功能。 (很多代码已经存在,因此我不愿意重写大量其他工作代码)
除此之外,单身人士提出了另一个问题。我的基于服务器的应用程序本质上是一个 DLL,它带有一个可以调用多个服务器实例的类。服务器实例类包含单例管理对象。通常,这将由 Windows 服务管理,因此服务器与机器的比例将为 1:1。
因此您可以将其视为(其中 -> 是 1:1,=> 是 1:many):
MACHINE -> ServiceHost(Windows 服务?) -> 服务器实例 -> 单例管理对象
但是,我们希望允许 SaaS 模型,这需要服务主机(无论是 Windows 服务还是 Win32 应用程序)能够根据业务需要启动多个服务器。因此,一台物理机可以运行一个服务器主机,该主机将运行多个服务器实例。
这将是(其中 -> 是 1:1,=> 是 1:many):
MACHINE -> ServiceHost(Windows 服务?)=> 服务器实例 -> 单例管理对象
问题是这些单例将在服务器之间共享。这不可能发生。单例必须与服务器实例 1:1。
假设我无法摆脱这些单例,我是否可以通过将服务实例类调用为单独的进程/内存空间来将这些服务器实例彼此分开?
我只能想象我需要启动多个 EXE(并使用 WCF 进行管理),每个服务器实例一个。这显然不是很好。
【问题讨论】:
-
想一想,我能不能用某种方式反射?
-
服务器实例如何访问管理对象?
-
你在做什么?上面似乎没有描述您的问题;而且我不知道“Scaling Singletons”是什么意思......(你怎么有超过 1 个......;这似乎违反直觉,至少可以这么说:P)
-
@silky:我基本上是在尝试将作为 Web 应用程序的应用程序作为 Win32 服务,但增加了扩展服务器实例以提供潜在 SaaS 业务案例的可能性。因此,如果您有 IServerInstance 具有自己的静态属性,我需要能够启动第二个实例,独立于第一个实例 - 但最好没有中间层 - 例如。单独的进程,因此 WCF
-
Program.X:啊哈。我知道了。好像你想在一个新的 AppDomain 中启动它,就像 Benjamin 下面建议的那样。但我不认为你的意思是“Win32”服务(即甚至不是.net)。我会说如果你可以完全删除单例是值得考虑的,但这可能不切实际。祝你好运!
标签: c# wcf design-patterns anti-patterns