我有一个处理应用程序本地化的类。我的目标是该类可以在整个应用程序中使用,因此我将其设置为静态。这允许我在我的应用程序的任何地方调用下面的代码。
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 */);
}
现在我不确定最好的方法是什么。任
Init
。还有一点需要注意:用户无权访问该类的来源。
答案 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,但它可能有点难以理解。
这里唯一乏味的事情是你需要随时传递它。我不介意显式,但很多人更喜欢使用依赖注入容器来管理开销。