提问人:Dominique 提问时间:9/19/2023 最后编辑:Dominique 更新时间:9/20/2023 访问量:76
每种方法都应该从同一件事开始
Every method should start with the same thing
问:
我正在使用一个接口,处理传入的消息。
该接口的定义如下所示:
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 的情况下实现?如果是,如何?(如果不可能,我也请把解决方案。我无法在这里实现它,但以后可能会很有趣)
提前致谢
答:
2赞
erikkallen
9/19/2023
#1
我能想到的 3 种方法:
- 使用像 Fody 这样的 IL 织布机。
- 编写生成 Handle 方法的源生成器。
- 创建一个执行日志记录的帮助程序,并将其委托给实际手柄
MessageHandler<TMessage> : IMessageHandler<TMessage>
选项 3 可能是最简单的(取决于您的应用程序结构),但我不确定它是否胜过只花 10 分钟并复制/粘贴调用(或创建一个方法并调用它)。log.Debug
Log(object message) => log.Debug($"Handling [{message.GetType().Name}]");
评论
0赞
Dominique
9/19/2023
我相信第三种选择也是最好的,但我不知道如何编程。
下一个:将对象列表传递给奇异方法
评论
where TMessage : string
真的是字符串的类型约束吗?string
string
sealed