应用程序启动代码设计

时间:2015-09-19 05:06:42

标签: design-patterns architecture

我们有一个应用程序启动的类和方法。 最初它的代码非常少。

随着时间的推移,这种方法被高度滥用,每个人都开始将他们的需求/领域特定要求纳入方法。将执行的许多代码和委托方法添加到此方法中。

我认为这种方法方法必须只执行应用程序启动生命周期代码应用程序所需的任何公共代码,如(创建数据库,开始记录等)而不是任何域/需求特定代码。

我能想到的几种方式是:

基于观察者模式/事件/ OSGI扩展点,如模型:此应用程序方法触发了应用程序启动事件。所有特定于域的侦听器都必须执行其代码。但是在这里,侦听器代码之间的顺序和依赖关系非常重要。

特定于域的代码的委托方法同样,这个会增加许多直接调用特定于域的代码,从启动代码中顺序调用(维护顺序)(这在我的代码中发生)< / p>

想知道是否还有其他办法可以解决这个设计问题?

欢呼声,

Saurav

2 个答案:

答案 0 :(得分:1)

说实话,这两个人,就是我要探索的人。

在第一种情况下,您可以创建一个树状结构来表示正在监听特定其他人完成的TasksCommands之间的依赖关系,并且可以并行执行它们。< / p>

在第二个方面,我在中型/大型应用程序中使用的方法是使用不同的模块,这些模块能够在从主应用程序逻辑调用时初始化。即引导代码按顺序定义它们或指定它们之间的依赖关系,然后将初始化逻辑委托给每个Module类。

需要考虑的其他方面是:

  • 测试初始化​​过程有多容易按预期工作?
  • 关注代码中发生的事情有多容易?

答案 1 :(得分:1)

我会开始使用界面来模拟您正在讨论的应用程序生命周期:

interface IApplicationLifecycle
{
    void Startup();
    void Shutdown();
}

下一部分是将所有生命周期代码重构为实现该接口的相应模块/子系统。然后根据需要将您的设置方法调用到模块中。

// populate LifecycleCollection (could maintain order there if needed)
public void Start()
{
    foreach (IApplicationLifecycle al in LifecycleCollection)
    {
       al.Startup();
    }
}

您正在调用其他代码,因此将存在依赖关系。但是,您可以使用接口标准化依赖项。按顺序添加一个列出初始化类的配置文件,并且对于从属代码中的任何给定数量的更改,您的启动方法将保持不变。我认为这就是你应该瞄准的目标。