我的方案 我的DLL中的许多类利用一些常见的服务,如日志记录。需要初始化这些常见服务。由于我不知道将首先构建哪些类,因此我在所有构造函数中包含与此类似的代码
Logger.Configure();
问题 有没有办法在我的DLL首次加载时订阅一个事件,以便在那里初始化公共服务,从而允许我的类假设公共服务可以使用。
我查看了AssemblyLoadEventHandler,但该示例演示了它在可执行文件的上下文中的使用,其中事件在应用程序启动时在Main方法中注册。
答案 0 :(得分:4)
最简单的方法是在需要它的类中使用class constructor(又名静态构造函数),因此每个类都会执行一次。但这仍然感觉不正确。
但是你可以封装调用(根据James的建议),然后在封装类的类构造函数中进行初始化,这样你就可以编写一次代码并运行初始化一次。
...或者更复杂的事情是定义模块初始值设定项。这是在加载程序集时运行的一段代码,正是您正在寻找的代码。但它并不容易访问,因为C#编译器没有提供一种开箱即用的方法。
这是Fody/ModuleInit发挥作用的地方。这是 weaver 。你编写了一个类,然后,在编译之后,Fody将你的类变成一个模块初始化器。是否值得为您的特定情况(通过封装技术)的麻烦由您决定。