微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我有一个类来处理我的应用程序的本地化.我的目标是该类可以在整个应用程序中使用,因此我将其设置为静态.这允许我在我的应用程序的任何地方调用下面的代码.
Localizer.GetString(/* Key to localize */)

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

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

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

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

> Static Localizer但用户必须确保在使用该类之前调用​​Init.
>应用程序中全局静态类中的实例化Localizer.

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

解决方法

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

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

在应用程序启动时,您可以创建一个专门满足您需求的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关于它,但它可能有点难以遵循.

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

原文地址:https://www.jb51.cc/csharp/99516.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐