首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >主程序前的静态初始化

主程序前的静态初始化
EN

Stack Overflow用户
提问于 2014-05-28 20:48:30
回答 4查看 184关注 0票数 3

我有一个软件,其中有一个中央抽象工厂方法负责打开文件。最初,工厂知道它可以打开的所有文件类型和它创建的相应对象(每个文件类型都有不同的处理程序),但是随着时间的增长,它变得不切实际了:第一,在处理新的文件类型时,不需要修改工厂类;其次,一些具体的文件处理程序存在于单独的all中,使它们无法从工厂访问!(文件处理程序有时要求工厂处理只索引到其他文件的路径的文件,因此他们必须知道工厂;如果工厂知道这些文件,则依赖项将是循环的)

我们提出的解决方案是对每个新的对象类型“注册”到工厂,这样一旦创建了工厂方法,它就会测试已注册的对象类型,看看哪种类型最合适并创建它。

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

有什么设计模式我们遗漏了吗?用不同的方法来处理这件事?需要注意的是,需要向工厂注册的文件处理程序位于单独的DLL中,必须引用工厂。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-05-28 22:00:24

我想出的最佳解决方案(在与讨论时)是要么使用Unity,要么使用属性标记所有文件类型的处理程序,然后通过反射将它们加载到工厂的静态c‘’tor上。例如:

代码语言:javascript
复制
[FileHandler]
public class TxtFileHandler : FileHandlerBase
{
...
}

然后使用反射加载所有标记为FileHandler的类,并注册它们,例如使用属性将它们映射到文件扩展名。

票数 0
EN

Stack Overflow用户

发布于 2014-05-28 20:53:12

我不认为一个dll宽函数初始化一个dll是一个黑客。这正是DllMain对本机DLL所做的。

在每个dll中创建一个函数,在加载时初始化它,并让它向工厂注册。然后在主应用程序中调用该函数作为DLL加载代码的第一个函数。

但是,更好的方法是使用某种形式的依赖注入库,例如统一,它可以通过配置文件通过反射自动处理DLL中类型到工厂的注册。

票数 1
EN

Stack Overflow用户

发布于 2014-05-28 21:00:30

似乎您在应用程序的设计上有一些问题。有一些技术可以阻止循环依赖,如您的。通常,程序员使用倒置控制来实现这一点。在这种情况下,您可以在处理程序的“工厂”类接口中使用,而不是具体的实现。接口应该在与工厂相同的dll中定义,或者在另一个“核心”dll中定义,这些dll将从您的dll中引用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23921566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档