簡體   English   中英

如何在單獨的文件中實現事件處理程序並使用依賴注入附加它?

[英]How to implement event handler in a separate file and attach it by using dependency injection?

我正在使用 Discord.Net 創建 C# Discord 機器人。 我的應用程序正在使用依賴注入,並且在 Program.cs 文件中我可以訪問 DiscordSocketClient 的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;
    }
}

附加此事件偵聽器的最佳/最簡單方法是什么? 我想到的第一個解決方案是將此處理程序注冊為 singleton 服務

serviceCollection.AddSingleton<UserJoinedHandler>();

然后在我的 Program.cs 文件中我可以這樣做

discordSocketClient.UserJoined += serviceProvider.GetService<UserJoinedHandler>().OnUserJoined;


注冊處理程序有更好的解決方案嗎? 例如,使用像[ThisClassHandlesTheUserJoinedEvent]這樣的反射或注釋,並讓客戶端通過添加像discordSocketClient.SearchForEventHandlingAnnotations()這樣的擴展方法來搜索這些?

我知道這聽起來像是過度工程,但這個項目很大,我喜歡有組織的代碼。

這更像是一半的答案/一半的評論。

注意不要過度使用依賴注入。 它是一個很好的工具,可以幫助您避免代碼中的緊密耦合,並使依賴服務的測試更容易,但它並不意味着幫助您組織代碼。

在您的情況下,您實際上並沒有依賴服務 - 即依賴於您的處理程序的服務。 這意味着實際上沒有任何東西可以注入它們。 是的,您可以創建一個包裝器 class 您可以注入其中收集並注冊所有處理程序,但它真的為您增加了任何價值嗎?

如果我是你,我只會有一個助手 class 到RegisterClientHandlers ,然后為你的處理程序訂閱那里的所有事件。 如果您隨后認為您需要能夠測試處理程序的不同組合(例如UserJoinedHandler_v2UserLeftHandler_v1 ),那么您可以開始考慮使用通用處理程序接口將它們注入到幫助程序 class 中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM