我目前正在使用WPF为我的游戏引擎构建一个工具。该工具以项目为中心(想想Visual Studio,XCode等),并允许用户一次编辑一个项目。
目前,我的实现托管项目类的单个实例ArchitectProject
。作为singleton类的属性,所有其他组件都可以使用它。我觉得这个实现有点像黑客,并不像它可能或应该那样整洁,简单或优雅。
ProjectManager
类是宿主应用程序中的单例类,它提供对Project
属性的全局访问。公开了各种其他属性和方法,主要是Project类中的超集,但使用ProjectManager
属性来提高效率。
这对我来说真的非常错误。首先,静态构造函数从一开始就初始化一个新的Project实例,以便WPF在设置数据绑定时不会抱怨空引用。有多个控件和其他组件需要访问当前项目实例,尤其是那些绑定到其属性的数据。进一步使数据绑定情况复杂化的是,无论何时用不同的实例替换属性值(例如,加载现有项目,创建新项目),所有WPF数据绑定都将丢失,因此需要额外的事件和其他额外的废话。确保每个控件的数据绑定保持正确。
其次,使当前Project
实例全局可访问的结果是一堆相关的hackery,以使实现正常工作。我不专业的一切都告诉我,我做的工作超出了我的需要,而且我从一开始就做错了。
我想我的问题,最后,我应该如何在我的应用程序中实现全局可访问的属性?我一直都喜欢编写所有内容的概念,就像你在写作一样一个API。如果一个开发人员想要挂钩我的应用程序,所需的黑客程序和额外的步骤让一切工作都不会立即显现出来,并且这让我的设计很糟糕。
想法?
答案 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;
}
}
}