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

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

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

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

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

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

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

  • 静态定位器,但用户必须确保在使用该类之前调用Init
  • 在应用程序中的全局静态类中实例化Localizer。
  • 还有一点需要注意:用户无法访问课程的源代码。


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

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

    在应用启动时,您可以创建一个专门针对您的需求的Localizer实例:

    var localizer = new Localizer(...);
    

    然后,只要组件需要定位器,您就可以将其传递

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

    这使得本地化程序易于修改,使得类可以很容易地独立测试,并且可以轻松配置不同的组件(如果您希望帮助页面突然一直是英文的,或者其他特定的页面?)。

    如果现在还不清楚这是Misko Havery关于不寻找东西的一个很好的谈话。 Martin Fowler也有一篇很好的文章,但它可能有点难以遵循。

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

    链接地址: http://www.djcxy.com/p/84521.html

    上一篇: Global instance of a class or static class with initialization method

    下一篇: Why do we need break after case statements?