.NET:订阅事件,解耦。国际奥委会?

.NET: Subscribe to event, decoupled. IOC?

我正在 .NET/C# 中编写一项服务,用于接收项目更新。 当一个项目更新时,我想做几个动作,以后还会有更多的动作。我想通过一些常见的模式将事件中的动作分离出来。我的大脑说国际奥委会,但我很难找到我想要的东西。 基本上我在想的是让控制器接收更新的项目,通过配置来订阅事件并调用它们。当然,存在一些轻量级、快速且易于使用的框架,这仍然是最新的。 你会推荐什么,为什么? (强调易于使用和快速)。

有一种模式使用 DI 容器(IoC,是的)。有很多 DI 容器,我个人使用 Castle Windsor。但是任何容器都应该做到这一点。 比如你可以创建这样一个接口:

public ISomeAction
{
    void Execute(SomeArg arg);
}

而且,当你需要调用所有的动作时,你可以这样使用:

var actions = container.ResolveAll<ISomeAction>();
foreach (var action in actions)
{
    action.Execute(arg);
}

要"register"一个动作,你需要做这样的事情:

container.Register(Component.For<ISomeAction>().ImplementedBy<ConcreteAction());

如果需要,您可以为此使用 XML。 这是一个非常灵活的解决方案——您可以在应用程序的任何部分使用它。您可以实施此 "for future",即使您不需要订阅任何内容。如果有人将库添加到您的项目,他将能够通过简单地注册他的实现来订阅您的活动。

如果您想使用 .NET 事件,温莎城堡有一个有趣的工具:

https://github.com/castleproject/Windsor/blob/master/docs/event-wiring-facility.md

如果有人需要它,这里是如何在 StructureMap 中进行操作:

var container = new Container(_ =>
{
    _.Scan(x =>
    {
        x.TheCallingAssembly();
        x.WithDefaultConventions();
        x.AddAllTypesOf<IUpdateAction>();
    });
});

var actions = container.GetAllInstances<IUpdateAction>();

foreach (IUpdateAction action in actions)
{
    action.Execute(updatedItem);
}