c# - main 之前的静态初始化

标签 c# .net oop design-patterns

我有一个软件,其中有一个负责打开文件的中央抽象工厂方法。起初,工厂知道它可以打开的所有文件类型以及它创建的相应对象(每个文件类型都有不同的处理程序),但随着时间的推移它变得不切实际:首先,不希望摆弄工厂处理新文件类型时的类;其次,一些具体的文件处理程序存在于单独的 DLL 中,使它们无法从工厂访问! (文件处理程序有时需要工厂处理仅索引其他文件路径的文件,因此它们必须知道工厂;如果工厂知道它们,则依赖关系将是循环的)

我们想到的解决方案是让每个新的对象类型都向工厂“注册”自己,这样一旦创建了工厂方法,它就会测试注册的对象类型,看看哪个是最合适的,创建它。

最大的问题是:这些对象什么时候向工厂注册自己?理想情况下,它会在任何调用工厂之前发生一次。但是,由于在 C# 中您不能指望在访问类型之前调用静态 c'tor,所以我不知道如何做到这一点。我们当前的解决方案是执行一个 dll 范围的 Initialize 方法,该方法向工厂注册对象类型,但这显然是我不喜欢的 hack。

我们是否缺少某些设计模式?处理这个的不同方法?重要的是要注意,需要注册到工厂的文件处理程序位于必须引用工厂的单独 DLL 中。

最佳答案

您的应用程序设计似乎存在一些问题。 有一些技术可以阻止像你这样的循环依赖。通常程序员为此使用控制反转。 在这种情况下,您可以在处理程序的“工厂”类接口(interface)中使用而不是具体实现。接口(interface)应该在与工厂相同的 dll 中或在另一个“核心”dll 中定义,它们将从您的两个 dll 中引用。

关于c# - main 之前的静态初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23921566/

相关文章:

c# - LinkLabel 需要比 TextRenderer.MeasureText 更多的空间

c# - 在 WPF C# TreeView 中获取子节点的父节点

c# - 为什么 LsaAddAccountRights 会返回 STATUS_INVALID_PARAMETER?

c# - 通过 C# 代码隐藏将字符串传递给 .ASPX 中的 SQL

java - OOP Java 如何检查一个数组与另一个数组,并在另一个数组具有更高数字时替换数据?

c# - "Parameter passing to function"还是 "Assigning values to Properties and then using them in function"是更好的选择?

.net - 长时间同步操作期间刷新表单

c# - 如何使用异步命令 MVVM WPF

.net 2.0 IRC 组件

c++ - Const 对 Copy Constructor 重要吗?