.NET:订阅事件,解耦。 IOC?

时间:2017-09-13 08:56:31

标签: c# .net events inversion-of-control decouple

我正在.NET / C#中编写一个服务来接收项目的更新。 当项目更新时,我想做几个动作,将来会有更多的动作。我想通过一些commen模式来解除事件中的动作。我的大脑说国际奥委会,但我很难找到我寻求的东西。 基本上我正在考虑的是让控制器收到更新的项目,通过配置来查看订阅该事件的操作并将其全部调用。当然,存在一些轻量级,快速且易于使用的框架,这仍然是最新的。 你会推荐什么?为什么? (强调易于使用和快速)。

3 个答案:

答案 0 :(得分:0)

有一种模式使用DI容器(IoC,是)。有很多DI容器,我个人使用Castle Windsor。但任何容器都应该这样做。 例如,您可以创建这样的界面:

public ISomeAction
{
    void Execute(SomeArg arg);
}

并且,当您需要调用所有操作时,您可以像这样使用它:

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

To&#34;注册&#34;一个动作,你需要做这样的事情:

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

如果需要,您可以使用XML。 这是一个非常灵活的解决方案 - 您可以在应用的任何部分使用它。即使您不需要订阅任何内容,也可以实现这个&#34;以便将来使用#34;如果有人要为你的项目添加一个lib,他就可以通过简单地注册他的实现来订阅你的活动。

答案 1 :(得分:0)

如果你想使用.NET事件,那么Castle Windsor有一个有趣的设施:

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

答案 2 :(得分:-1)

如果有人需要它,那么继承人是如何在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);
}