0

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

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

但这可能在一段时间内不会发生——这些类提供其他服务;它们可能会被大量或少量使用。

我可以以某种方式强制这些静态结构吗?

有人能想出更好的方法吗?(这些不是动态加载的插件——在这种情况下,作为加载的一部分,我会检查它们是否有像 IFooProvider 这样的接口)。

编辑:好的 - 我无法控制何时调用构造函数。我应该改用什么?我的中央服务不直接了解这些提供商。所以调用'init'函数没有打开。我正在尝试将 pub 子模型想象为事件总线,但这不一样。“订阅者”需要在需要某些东西时调用“发布者”(而不是在发生某些事情时被调用)

4

1 回答 1

1

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

您要做的是统一搜索 在您通过“按约定注册IFooProvider”系统指定的程序集中实现的所有类,并将自动加载它们。

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

于 2014-07-16T01:40:38.833 回答