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

时间:2016-02-23 07:42:15

标签: c# architecture

我需要建筑建议。

我有两个班级:

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类中,我有一个CurrentPage属性,这是应用程序中很多类想要访问的属性。

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

但是,为许多其他类提供访问同一个类的最佳方法是什么?

3 个答案:

答案 0 :(得分:1)

实际上,将Shell类传递给需要它的其他类的解决方案并不算太糟糕,特别是如果你通过构造函数执行它。

当然,最常见的方法是使用Singleton或使用静态方法的类。但如果你是诚实的,在这种情况下,他们两个都只是蒙面的全球状态。

单例的最初目的是确保只存在一个类的一个对象,而不是使某些东西易于访问。然而,后者是开发人员使用它的最常见原因。因此其他人称之为“反模式之王”:)

老实说,在某些情况下,我自己同时使用Singleton和静态方法,以使我的生活更轻松(在短期内)。但我从未对此感到满意。

总结一下,据我所知,你有三个基本选择:

  • 在构造函数中传递对象
  • 的Singleton
  • 静态方法

所有这些都有其优点和缺点,但我认为第一个解决方案最干净,因为它没有引入全局状态。

答案 1 :(得分:0)

您可以将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,这样做并不好。我还将你的二传手ChangePage重命名为SetCurrentPage,所以现在很明显它是一个二传手

答案 2 :(得分:0)

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

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

选择完全符合您要求的那个。