每种方法都应该从同一件事开始

Every method should start with the same thing

提问人:Dominique 提问时间:9/19/2023 最后编辑:Dominique 更新时间:9/20/2023 访问量:76

问:

我正在使用一个接口,处理传入的消息。
该接口的定义如下所示:

public interface IMessageHandler<TMessage> where TMessage : ...
{
    void Handle(TMessage message);
}

此接口在 DLL 中定义。
我无法修改该DLL。

我有不同的类,看起来都是这样的:

public class GeneralManager:
IMessageHandler<GetStockMessage>,
IMessageHandler<GetLocationMessage>,
IMessageHandler<GetDetailsMessage>,
...
public class SpecificManager:
IMessageHandler<GetListMessage>,
IMessageHandler<GetPositonsMessage>,
...

可以想象,对于这些消息中的每一个,我的管理器类中都有一个处理程序,如下所示:

public void Handle(GetStockMessage message) { ... }
public void Handle(GetLocationMessage message) { ... }
public void Handle(GetDetailsMessage message) { ... }

我希望这些方法中的每一个都从以下行开始:Handle()

log.Debug($"Handling [{message.GetType().Name}]");

由于这些方法不少于 149 种,我宁愿不需要到处做“复制/粘贴”:-)Handle()

这是否可能在不修改包含接口定义的 DLL 的情况下实现?如果是,如何?(如果不可能,我也请把解决方案。我无法在这里实现它,但以后可能会很有趣)

提前致谢

C# 继承 方法 启动

评论

0赞 Dean Van Greunen 9/19/2023
您可能需要使用装饰器,例如 在方法执行之前和之后注入行为 在此处阅读更多内容
7赞 Ralf 9/19/2023
where TMessage : string真的是字符串的类型约束吗?
0赞 Matthew Watson 9/19/2023
Fody 是一个很好的免费代码注入工具,您可以使用它来执行此操作。
6赞 Matthew Watson 9/19/2023
你甚至不能将一个类型限制为 - 你会得到一个编译错误(因为是 )。stringstringsealed
2赞 Matthew Watson 9/19/2023
实际上,我所知道的所有方法修饰工具都要求您为正在修饰的每个方法添加一个属性,因此它们不会帮助您避免编写任何其他代码。

答:

2赞 erikkallen 9/19/2023 #1

我能想到的 3 种方法:

  1. 使用像 Fody 这样的 IL 织布机。
  2. 编写生成 Handle 方法的源生成器。
  3. 创建一个执行日志记录的帮助程序,并将其委托给实际手柄MessageHandler<TMessage> : IMessageHandler<TMessage>

选项 3 可能是最简单的(取决于您的应用程序结构),但我不确定它是否胜过只花 10 分钟并复制/粘贴调用(或创建一个方法并调用它)。log.DebugLog(object message) => log.Debug($"Handling [{message.GetType().Name}]");

评论

0赞 Dominique 9/19/2023
我相信第三种选择也是最好的,但我不知道如何编程。