gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:30:27 26 4
gpt4 key购买 nike

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

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

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

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

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

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

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

请注意:用户无权访问该类的源代码。

最佳答案

您正在做的事情的替代方法是使用依赖注入(inject)。依赖注入(inject)是一个 super 奇特的名字,用于将东西传递给事物而不是那些事物直接访问那些东西。我知道这是一个模糊的陈述 - 但如果你的类接受一个字段的参数而不是创建类型本身 - 它已经在使用依赖注入(inject)。

那么,假设您有一个 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关于它,但它可能有点难以理解。

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

关于c# - 具有初始化方法的类或静态类的全局实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29740389/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com