如何构建一个应用程序,其中许多功能 classes 想要访问相同的 class?

How to architecture an app where many functionality classes want to have access to same class?

我需要架构方面的建议。

我有两个 classes:

public class Shell
{
    public IPage CurrentPage { get; set; }

    public void ChangePage(IPage page)
    {
        CurrentPage = page;
    }
}

public class SomeFunctionallityClass 
{
    private readonly Shell _shell;

    private readonly IPage _somePage;
    public Model1(Shell shell, IPage page)
    {
        _shell = shell;
        _somePage = page;
    }

    public void MakeSomeCrazyStuff()
    {
        _shell.ChangePage(_somePage);
    }
}

在 Shell class 我有一个 CurrentPage 属性 这是 属性 应用程序中的很多 classes 想要访问到。

现在我将 Shell 对象传递给需要更改页面的 classes。

但是让许多其他 class 访问相同 class 的最佳方式是什么?

您可以使您的 Shell 静态化:

public static class Shell
{
   private static IPage CurrentPage { get; set; }

   public static void SetCurrentPage(IPage page)
   {
      CurrentPage = page;
   }
}

public class SomeOtherClass
{
   public vod ShowShellPropery()
   {
      MessageBox.Show(Shell.Property);
   } 
}

还有一个 setter ChangePage,您应该将 CurrentPage 设为私有。否则,您有两种更改当前页面的方法:使用 setter ChangePage(page) 和使用 CurrentPage = page,这是不好的。另外我把你的setterChangePage重命名为SetCurrentPage,所以现在很明显是setter

您可能需要考虑使用单例设计模式:

https://msdn.microsoft.com/en-us/library/ff650316.aspx

选择完全符合您要求的一项。

实际上,您将 Shell class 传递给彼此 class 的解决方案需要它,并不算太糟糕,特别是如果您通过构造函数来实现。

当然,最常见的方法是使用单例或 class 静态方法。但是,如果你说实话,在这种情况下,它们都不过是蒙面的全局状态。

单例的初衷是确保一个class的对象只有一个存在,而不是为了方便访问。然而,后者是开发人员使用它的最常见原因。其他人因此称它为 "King of Antipatterns" :)

老实说,在某些情况下,我自己会同时使用 Singleton 和静态方法,以使我的生活更轻松(短期内)。但是我一直都觉得不好。

总而言之,据我所知,您有三个基本选择:

  • 在构造函数中传递对象
  • 单例
  • 静态方法

所有这些都各有利弊,但我认为第一个解决方案最干净,因为它不引入全局状态。