具有初始化方法的类或静态类的全局实例

时间:2015-04-20 06:09:48

标签: c#

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

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。
  3. 还有一点需要注意:用户无权访问该类的来源。

1 个答案:

答案 0 :(得分:4)

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

所以,假设你有一个Localizer课程。它有 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,但它可能有点难以理解。

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