【问题标题】:.NET: Subscribe to event, decoupled. IOC?.NET:订阅事件,解耦。国际奥委会?
【发布时间】:2017-09-13 08:56:31
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    public ISomeAction
    {
        void Execute(SomeArg arg);
    }
    

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

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

    要“注册”一个动作,你需要这样做:

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

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

    【讨论】:

    • 感谢您的回答。所以我只调用“container.Register(Component.For().ImplementedBy
    • 这是选项之一。您还可以通过调用以下方法在 lib 中注册每个 ISomeAction 实现:container.Register(Classes.FromThisAssembly().BasedOn());,更多信息请参见 github.com/castleproject/Windsor/blob/master/docs/…
    【解决方案2】:

    如果您想使用 .NET 事件,Castle Windsor 有一个有趣的工具:

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

    【讨论】:

      【解决方案3】:

      如果有人需要,以下是如何在 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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多