强制调用静态构造函数

本文关键字:构造函数 静态 调用 | 更新日期: 2023-09-27 18:13:09

我有一个中央服务(在一个非常大的在线系统中),其中类将自己注册为'foo',提供者。当系统需要获得一些foo时,它调用所有注册的提供商。我的问题是,使类注册本身的自然位置是在静态构造函数中;但是静态构造函数只有在类的一部分被调用时才会被调用。

static Widdler()
{
   FooManager.RegisterProvider(() => GetMyFoos());
}

但这可能在一段时间内不会发生——类提供其他服务;它们可能使用得很多,也可能使用得很少。

我可以强制这些静态结构吗?

有谁能想出更好的办法吗?(这些不是动态加载的插件-在这种情况下,作为加载的一部分,我会检查他们的一些接口,如IFooProvider)。

编辑:OK -我无法控制何时调用构造函数。我应该用什么代替呢?我的中心服务并不直接了解这些提供商。所以调用init函数没有开启。我正试图想到一个酒吧sub模型像一个事件总线,但这是不一样的。"订阅者"需要在需要某些东西时调用"发布者"(而不是在发生某些事情时被调用)

强制调用静态构造函数

通常解决这个问题的方法是使用Unity这样的框架,让它代替你的RegisterProvider

你要做的是统一搜索在你通过"Registration by Convention"系统指定的程序集中实现IFooProvider的所有类,并自动加载它们。

然后在代码中,您需要实现IFooProvider的所有类的列表,您只需调用container.ResolveAll<IFooProvider>,它将返回它检测到的实现接口的所有类的IEnumerable<IFooProvider>