如何确保dll程序集中的singleton observer对象在启动时被实例化

本文关键字:对象 observer singleton 启动 实例化 集中 何确保 确保 程序集 程序 dll | 更新日期: 2023-09-27 18:22:21

我创建了一个类(观察者),它将根据其他类(发布者)中的某些事件执行一些操作。观察者和发布者都在一个dll中。

我可以在程序集中创建另一个类,并要求客户端应用程序在使用其他类之前调用BootStrapper.Configure();但是,我希望避免同时更新所有客户端应用程序。

我可以为发布者类创建一个基类,并从那里调用BootStrapper.Configure();然而,发布者目前继承了不同的基类。我现在不想重构那些类。

我真正想做的是确保"observer"类在客户端应用程序启动时实例化,或者第一次引用dll中的类时实例化。

确保在任何"发布者"发布事件之前实例化"观察者"类的最佳方法是什么?

示例项目:https://www.box.com/s/0ihvp11kd7bfb6mqlnmc我想让BootStapper.cs中的任何方法在加载LogicLibrary时执行。

如何确保dll程序集中的singleton observer对象在启动时被实例化

根据发布的项目更新

所提供的解决方案中的当前设计将发布者限制在程序集中(因为引导程序正在对委托连接进行硬编码),这只会增加复杂性而没有好处。如果您在包含观察者的程序集之外有发布者,那么您当前的模式将需要在每个包含发布者的程序集中有一个引导程序。这只是将线路从一个地方移动到一个不太明显的地方,最终将更难维护。

我建议查看IObserver接口和那里给出的示例实现:http://msdn.microsoft.com/en-us/library/dd783449.aspx

以前的回应:

如果您只是使用一个经典的singleton作为观察者,并且需要引用所述singleton来连接事件,那么引用singleton的行为将确保其创建。

似乎没有必要指定必须在引用DLL中的任何类之前创建观察器。您只需要确保在任何发布者引发其事件之前创建了观察者。

一个更好的解决方案是使用IOC容器来创建观察者的单例实例,并自动为所有发布者连接事件。

有几种方法可以实现这一点。一种方法可能是在C++/CLR包装DLL中使用DllMain,但我必须对此进行额外考虑。我更可能从DLL中每个类的静态构造函数中调用某种实例化方法,以使其得到完全管理。

internal static class DllMain
{
    private volatile bool Initialized = false;
    public static void OnStaticConstructor()
    {
        if (!Initialized)
        {
            Initialized = true;
            Initialize();
        }
    }
    private void Initialize()
    {
        // Put whatever you need to run once here.
    }
}
public class A
{
    static A()
    {
        DllMain.OnStaticConstructor();
    }
    // ...
}
public class B
{
    static B()
    {
        DllMain.OnStaticConstructor();
    }
    // ...
}