2

也许这是一个太宽泛的问题,但我仍然想听听什么是最佳实践和什么被认为是“正确的”。我没有找到类似的话题,可能是因为它的通用性,因此很难搜索。我应该在'main'方法中编码?

这一切都是在我们开始使用Windows服务项目并向其添加其他服务时开始的。以前,主要方法是我们认为组合根,我们的Io​​C容器注册码,app.config阅读和类似的主要方法是以这种或那种形式。在组装所需的依赖关系之后,我们通过调用容器上的Resolve并运行它来创建服务。

当我们创建了另一个继承自ServiceBase的类时,我们注意到将main作为组合根已不再有意义,因为多个服务可能完全不同,因此需要不同的初始化代码。

我在mather上发现的唯一启发性帖子是this one from Mark Seemann,他声称OnStart是聚合根(在这种情况下)。

一般来说,选择合适的组合根时最好采取什么方法?我是否应该将这种Windows服务场景视为一个异常情况,只是对其进行不同的编码,而将其他项目类型的主要方法作为组合根源,还是存在一种在所有情况下都可用的更一般的方法?

也许事实上,服务需要非常不同的设置是一个指标,他们应该分离在多个独立的项目,其中主将再次用作组成的根?

我们通常使用.Net,但这可能也适用于许多其他编程语言。

回答

0

最好将Main()方法看作是操作系统所需的一个钩子 - 这应该是它唯一的责任。应该有尽可能少的代码,只有启动实际应用程序所需的最低限度的代码 - 它不应该成为任何概念考虑的一部分。

+0

那么你的建议是在哪里放置初始化代码?例如容器设置,日志配置。可能为此创建一个小样本? – julealgon

+0

取决于。在你的情况下,我会写一个方法(称为'Init()'或类似的),并从'Main()'调用这个方法。然后,我会有一个'Run()'方法(它基本上是一个等待发生的无限循环),最后是一个方法'CleanUp()'。主然后会读取'{Init();跑();清理(​​); }“。 –

+0

请注意,我描述的情况有两个独立的服务。如果我按照你的建议进行操作,我会将它们连接到单个初始化方法中,并且我不能在它们之间设置任何优先级:假设我在同一个进程中有两个服务,第二个依赖于第一个运行。如果我使用程序类作为组合根,就像你建议我无法正确初始化第二个服务,因为第一个服务已经不能运行了。 – julealgon

相关问题