我的单身人士设计不如它应该优雅吗?什么是最佳做法?

时间:2010-09-14 13:58:43

标签: c#

我目前正在使用WPF为我的游戏引擎构建一个工具。该工具以项目为中心(想想Visual Studio,XCode等),并允许用户一次编辑一个项目。

目前,我的实现托管项目类的单个实例ArchitectProject。作为singleton类的属性,所有其他组件都可以使用它。我觉得这个实现有点像黑客,并不像它可能或应该那样整洁,简单或优雅。

ProjectManager类是宿主应用程序中的单例类,它提供对Project属性的全局访问。公开了各种其他属性和方法,主要是Project类中的超集,但使用ProjectManager属性来提高效率。

这对我来说真的非常错误。首先,静态构造函数从一开始就初始化一个新的Project实例,以便WPF在设置数据绑定时不会抱怨空引用。有多个控件和其他组件需要访问当前项目实例,尤其是那些绑定到其属性的数据。进一步使数据绑定情况复杂化的是,无论何时用不同的实例替换属性值(例如,加载现有项目,创建新项目),所有WPF数据绑定都将丢失,因此需要额外的事件和其他额外的废话。确保每个控件的数据绑定保持正确。

其次,使当前Project实例全局可访问的结果是一堆相关的hackery,以使实现正常工作。我不专业的一切都告诉我,我做的工作超出了我的需要,而且我从一开始就做错了。

我想我的问题,最后,我应该如何在我的应用程序中实现全局可访问的属性?我一直都喜欢编写所有内容的概念,就像你在写作一样一个API。如果一个开发人员想要挂钩我的应用程序,所需的黑客程序和额外的步骤让一切工作都不会立即显现出来,并且这让我的设计很糟糕。

想法?

3 个答案:

答案 0 :(得分:4)

单身模式被许多人视为反模式。标准答案几乎总是使用(构造函数)dependency injection(DI)。您可以使用一个好的DI容器来帮助您构建图形中的所有对象。我个人使用Castle project中的on,但存在许多替代方案。

答案 1 :(得分:1)

在不了解有关您的应用程序的更多详细信息的情况下,我将从尝试引入Dependency Injection而不是您的单例开始。您仍然可以一次拥有一个项目,但通常您会发现,如果使用构造函数参数显式指定依赖项,则更容易处理初始化和某些事件。 (可能它不会解决你所有的问题)

答案 2 :(得分:0)

我实现单身人士的方式:

class SomeClass
{

   private static SomeClass instance;

   private SomeClass() {}

   public static SomeClass SingelInstance
   {
      get 
      {
          if(instance == null)
             instance = new SomeClass();
          return instance;
      }
   }
}