2015-04-20 76 views
7

我有一个类来处理我的应用程序的本地化。我的目标是这个类在整个应用程序中都是可用的,所以我使它成为静态的。这使我可以在我的应用程序的任何地方调用下面的代码。具有初始化方法的类或静态类的全局实例

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

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

一个解决方案,我想的是使定位器类不是静态的,添加一个构造函数,设置字段和我的应用程序初始化的全局static class类,像这样:

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

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

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

还有一点需要注意:用户无法访问该类的源代码。

+0

也许使用注册表模式? – progsource

+0

您可以使用Localizer类的静态构造函数来初始化字段,而不是init方法。 –

回答

4

你正在做的一种替代方法是使用依赖注入。依赖注入是的一个超级想象名称,它将东西传递给事物,而不是直接访问那些东西。我知道这是一个模糊的陈述 - 但是如果你的类为一个字段提供参数而不是自己创建类型 - 它已经在使用依赖注入。

因此,假设您有Localizer类。它有静态方法,有本地化器的静态实例只是全局的。你通过它周围

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

这使得 -

var localizer = new Localizer(...); 

然后,每当一个组件需要的定位:

你当应用程序启动时创建一个Localizer实例专门您的需求一次本地化器可以很容易地修改,使得这些类可以很容易地单独测试,并且可以很容易地配置不同的组件(如果您希望帮助页面突然一直是英文的话,那么该怎么办?或者其他一些其他的speci fi cation c页?)。

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

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

+0

所以,如果我明白了,'var localizer'是一个全局变量,就像在我的'Globals'类中一样? – Krowi

+0

这是现在唯一适合的答案。 –

+0

@ Krowi no,整个观点是你没有_any_全局变量,全局变量不好,全局可变变量更糟。单身人士是一个有效的全球变量 - 它扮演着这个角色。所以是一个'静态'。在你的应用程序中有一个地方可以引导(启动)它,你希望创建本地化程序_there_和_pass it around_,而不是使用全局变量。 –