让我们假设我们有一个将在整个(c#)代码中广泛使用的类,例如Log类。假设日志将条目写入特定目录中的XML文件。现在,强制用户使用所需信息初始化类的一种尝试是将默认(无参数)构造函数设为私有,并提供一个带有 logdirectory 参数的构造函数。这样做的缺点是,用户每次需要将某些内容写入日志并因此创建Log类的实例时,需要提供该参数。
还有哪些其他选择?提前感谢您的回复。
答案 0 :(得分:4)
四个选项(主要是涵盖,但没有明确和一起):
只需将调用设为静态,并包含静态初始化。这对于测试(依赖于它的类)来说非常糟糕,但非常简单。
按照大多数其他答案的建议使用singleton。从测试的角度来看,这可能更好(您可以使用内部方法替换单例以仅用于测试目的),并实现用于模拟目的的接口。
使用依赖注入:让需要依赖的所有内容都在构造函数或其他内容中使用,并让你的DI框架将所有内容挂钩。从测试的角度来看,情况要好得多,但这并不方便。
使用工厂 - 如单例,但将实现与构造分开。 (它可能有效地最终成为一个单身人士,但没有那么多的假设。)
答案 1 :(得分:1)
我认为你想要搜索的术语是Singleton模式。我不会在这里完全写出来 - 这是一个非常谷歌的术语。但基本上,当应用程序加载时,您会初始化对象的单个实例,然后在整个应用程序中引用相同的实例
答案 2 :(得分:0)
你是如此接近......将它作为一个单独实现,你不需要多次初始化。简短的回答是在自身内部创建一个类的静态公共实例,以及一个公共静态方法,它可以(a)初始化此实例(如果它当前为null),或者(b)返回已初始化的实例。
单身模式需要考虑更多细节,但这应该让你开始。
答案 3 :(得分:0)
只需使Logger.Log()函数成为静态调用,并使其引用作为目录信息的静态成员。然后,您只需在执行开始时将目录信息成员设置一次,然后对Logger.Log()的所有后续调用将“正常工作”。
答案 4 :(得分:0)
单件。您可以使用静态类,因此不必实例化它。然后,如果你有一个日志目录,有一个默认的日志路径和一个可写的writelog方法参数或一个重写的方法签名,一个接受路径,一个假定默认来自配置文件。