我正在用 .NET/C# 编写一个接收项目更新的服务。当一个项目更新时,我想做几个动作,未来还会有更多动作。我想通过一些 commen 模式将事件与事件分离。我的大脑说国际奥委会,但我很难找到我想要的东西。基本上我在想的是让控制器接收更新的项目,通过配置来订阅事件并调用它们。当然,存在一些轻量级、快速且易于使用的框架,它仍然是最新的。你会推荐什么,为什么?(强调易于使用和快速)。
问问题
174 次
3 回答
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);
}
要“注册”一个动作,您需要执行以下操作:
container.Register(Component.For<ISomeAction>().ImplementedBy<ConcreteAction());
如果需要,您可以为此使用 XML。这是非常灵活的解决方案 - 您可以在应用程序的任何部分使用它。即使您不需要订阅任何内容,您也可以“为将来”实现此功能。如果有人将一个库添加到您的项目中,他将能够通过简单地注册他的实现来订阅您的事件。
于 2017-09-13T09:23:50.137 回答
0
如果你想使用 .NET 事件,Castle Windsor 有一个有趣的工具:
https://github.com/castleproject/Windsor/blob/master/docs/event-wiring-facility.md
于 2017-09-14T12:45:44.427 回答
-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);
}
于 2017-09-20T09:16:02.500 回答