【问题标题】:Global instance of a class or static class with initialization method具有初始化方法的类或静态类的全局实例
【发布时间】:2015-06-26 17:39:52
【问题描述】:

我有一个类来处理我的应用程序的本地化。我的目标是该类可在整个应用程序中使用,因此我将其设为静态。这让我可以在我的应用程序的任何地方调用下面的代码。

Localizer.GetString(/* Key to localize */)

该方法使用 Localizer 类中的多个字段。为了确保设置了这些字段,添加了 Init 方法来初始化 Localizer。如果我班的用户忘记调用Init,例如在应用程序启动时,将出现异常,因为未设置字段。

我正在考虑的一个解决方案是使 Localizer 类不是静态的,在我的应用程序中添加一个设置字段并在全局 static class 中初始化类的构造函数,如下所示:

public static class Globals
{
    public static Localizer Localize = new Localizer(/* Field arguments here */);
}

现在我不确定最好的方法是什么。要么

  1. 静态定位器,但用户必须确保在使用类之前调用​​Init
  2. 应用程序的全局静态类中的实例化 Localizer。

还有一点注意:用户无权访问类的源代码。

【问题讨论】:

  • 也许使用注册表模式?
  • 您可以使用 Localizer 类的静态构造函数来初始化字段,而不是使用 init 方法。

标签: c#


【解决方案1】:

您正在做的另一种方法是使用依赖注入。依赖注入是一个超级花哨的名称,用于将东西传递到事物中,而不是直接访问那些东西。我知道这是一个模糊的陈述——但是如果你的类为一个字段接受一个参数而不是创建类型本身——它已经在使用依赖注入了。

所以,假设你有一个 Localizer 类。它有 no 静态方法,并且 no 本地化器的静态实例只是全局的。

您在应用启动时创建一个专门满足您需求的 Localizer 实例:

var localizer = new Localizer(...);

然后,每当组件需要本地化器时,您就可以传递它

var component = new MyComponent(localizer); // we pass the values in

这使得本地化程序易于修改,使类易于单独测试,并易于以不同方式配置不同的组件(如果您希望帮助页面突然总是用英文怎么办?或其他一些 特定页面?)。

如果还不清楚here's a nice talk by Misko Havery about not looking for things。也有 a nice Martin Fowler article 关于它,但可能有点难以理解。

这里唯一乏味的是你需要随时传递它。我不介意明确性,但很多人更喜欢使用依赖注入容器来管理开销。

【讨论】:

  • 所以如果我理解正确的话,var localizer 是像我的Globals 类中的全局变量?
  • @Krowi 不,重点是您没有 any 全局变量,全局变量不好,全局可变变量更糟。单例实际上是一个全局变量——它扮演着这个角色。 static 也是如此。在您的应用程序中有一个地方可以引导(启动)它,您想要创建本地化器那里传递它而不是使用全局变量。
  • @BenjaminGruenbaum 我认为问题是我正在使用视图和视图模型。如果我在App.xml.cs 的VS 中(我假设的应用程序的开始)创建我的Localizer 实例,那么我将如何将它传递给所有ViewModel?现在我只有不依赖于彼此或应用程序的 ViewModel。
  • @Krowi 绝对可以在 WPF 应用程序中传递它 - 很多关于 WPF 和依赖注入的在线教程 :)
  • @BenjaminGruenbaum 我用谷歌搜索了一下,在 SO 上找到了一个使用 Ninject 的帖子,wpftutorial 上的另一个帖子使用了IUnityContainer(根据 MSDN,这似乎已经过时,而另一个帖子正在使用 @ 987654332@ 来完成这项工作。我真的对所有选项感到困惑,我不确定对于 MVVM WPF 应用程序来说最好的解决方案是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
  • 2022-01-19
相关资源
最近更新 更多