【发布时间】:2021-03-23 13:51:23
【问题描述】:
我正在使用 Discord.Net 创建 C# Discord 机器人。我的应用程序正在使用依赖注入,并且在 Program.cs 文件中我可以访问 DiscordSocketClient 的单例实例。
此实例提供许多事件,例如
discordSocketClient.UserJoined += async socketGuildUser =>
{
// do things here
};
这似乎是一个与 C# 更相关的问题。我想创建单独的文件,每个文件都有一个事件处理程序,以保持代码井井有条。示例事件处理程序可能如下所示
public class UserJoinedHandler
{
// Use the constructor to get access to services by using DI
public Task OnUserJoined(SocketGuildUser socketGuildUser)
{
// Do things here
return Task.CompletedTask;
}
}
附加此事件侦听器的最佳/最简单方法是什么?我想到的第一个解决方案是将此处理程序注册为单例服务
serviceCollection.AddSingleton<UserJoinedHandler>();
然后在我的 Program.cs 文件中我可以这样做
discordSocketClient.UserJoined += serviceProvider.GetService<UserJoinedHandler>().OnUserJoined;
是否有更好的解决方案来注册处理程序?例如。使用像[ThisClassHandlesTheUserJoinedEvent]这样的反射或注解,并让客户端通过添加像discordSocketClient.SearchForEventHandlingAnnotations()这样的扩展方法来搜索它们?
我知道这听起来像是过度工程,但这个项目很大,我喜欢有条理的代码。
【问题讨论】:
-
您设想什么样的可插拔架构需要这种复杂性?
-
将客户端注入处理程序并订阅事件。
-
我还不知道,但我只是希望有一种“最优化”的方式:)
-
@Nikosi 但是我必须在某个地方注入所有这些处理程序来初始化它们,不是吗?
-
为处理程序创建一个通用接口,并有一个托管服务接收处理程序,以便它们可以在启动时初始化
标签: c# .net-core dependency-injection discord.net