アプリケーション間でコントローラーインスタンスを共有するためのベストプラクティス?

ゴージャス

アプリケーションの機能

TelegrafJSTelegramを使用しボットを作成していますが、これまでに、ボットを初期化して起動するというクラスを作成しましたBotmiddlewares

const Telegraf = require('telegraf');
const session = require('telegraf/session');

// Commands
const { commands } = require('../commands');

class Bot {

    constructor() {
        this.bot = new Telegraf(process.env.BOT_TOKEN);
        this.bot.catch(error => {
            console.error(`Bot error: ${error}`);
        });
    }

    // Init bot configuration
    async init() {

        // Set session
        this.bot.use(session.middleware());

        // Set commands
        this.bot.use(commands);
    }

    // Start the bot
    async start() {

        // Start the bot
        await this.init();
        this.bot.startPolling();
    }
}

exports.Bot = Bot;

エントリファイルapp.jsBot、次のようにインスタンスを作成します。

const { Bot } = require('./logic/controllers/bot.controller');
let bot = new Bot();
await bot.start();

問題

commandsミドルウェアを見ると、Composerコマンドをに関連付けているbotので、基本的に次のようになります。

const Composer = require('telegraf/composer');
const { Message } = require('../controllers/message.controller');
let msgController = new Message();

let messageCommand = new Composer();
messageCommand.action(/message-delete.+/, msgController.delete);

module.exports = messageCommand;

基本的に、ユーザーがmessage-delete.message_id上記のコマンドのコールバックを持つボタンを押すとトリガーされます。

問題は次のとおりです。

Telegramコントローラ内でボットインスタンスを使用する必要がありますmsgController。実際には、.deleteメソッドにパラメータを渡さずにコンテキストを使用しましたが、Telegram常にアクセス可能でなければならない場所にボットインスタンスを保存したい場合、どうすればよいですか?

私が思ったこと

私の考えはTelegram、クラスのインスタンスを作成するたびにボットインスタンスを渡すことです。例:

const { Markup } = require('telegraf');
const moment = require('moment');

// Models
const { MessageModel } = require('../models/message.model');

class Message {
    constructor(bot){
        this.bot = bot;
    }
}

これを処理するための良い方法ですか、それともより良い方法がありますか?

Mehdi

説明したパターンは依存性注入と呼ばれ、説明した要件を満たす1つの方法です。このアプローチには根本的な問題はありません。

別の方法は、アプリがであり、Telegramボットがこれらのイベントをリッスンして反応するイベント駆動型アーキテクチャを使用することですeventEmitter

イベント駆動型アプローチを実装する方法は次のとおりです。

  1. app.js、イベント・エミッタが定義され、インスタンス化モジュールに渡さなければなりません。
const EventEmitter = require('events');

class appEvents extends EventEmitter {}

const appEvents = new appEvents();

let bot = new Bot(appEvents);
let myMiddleware = new MyMiddleware(appEvents);
  1. bot.js イベントをリッスンして反応します。
appEvents.on('event', () => {
  console.log('an event occurred!');
});
  1. ミドルウェアモジュールは、適切な場合はいつでもイベントを発行します。
appEvents.emit('event');

ここでは、依存性注入ソリューションとは異なり、モジュール間の結合は緩いです。ミドルウェアモジュールは、ボットを明示的に呼び出しません。

この疎結合は、各モジュールが次に何が起こるかを心配することなくビジネスを処理するため、利点となる可能性があります。ただし、大規模なアプリケーションでは、イベントが発行されたときに何が起こるかを知るのが難しい場合があります(アプリケーションの複数の部分がそれをリッスンして反応する可能性があるため)。

両方のアプローチの長所と短所については、オンラインでたくさんの文献があり、あなた自身の意見を述べることができます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

類似のWebアプリ間でWeb層コード(コントローラーとJSP)を共有するためのベストプラクティス

分類Dev

最小限のダウンタイムでJava Webアプリケーションをデプロイするためのベストプラクティス?

分類Dev

Androidアプリケーションでオンラインデータをクエリするためのベストプラクティス?

分類Dev

WEBAPIサーバーとAndroidクライアントアプリケーション間でモデルを共有するためのベストプラクティスは何ですか

分類Dev

Angularjsアプリケーションで$ rootscopeを使用するためのベストプラクティスは?

分類Dev

nodejsコマンドラインアプリケーションを配布するためのベストプラクティス

分類Dev

Net Core 2WebApiのアプリケーションインサイト-プロパティを追加するためのコンテキストの共有

分類Dev

スプリングブートアプリケーションの値を格納するためのベストプラクティスは何ですか?

分類Dev

WebアプリケーションでCRMに接続するためのベストプラクティス

分類Dev

Go Webアプリケーションを更新するためのベストプラクティス

分類Dev

Electronアプリケーションを保護するためのベストプラクティス

分類Dev

$ resourceを使用し、複数のコントローラー間で結果を共有するためのベストプラクティスは何ですか?

分類Dev

古いSpark1.2.0アプリケーションログをクリーンアップするためのベストプラクティス?

分類Dev

Springでアプリケーション全体のデータを保持するベストプラクティス

分類Dev

エンティティ間でFormTypeを共有する、ベストプラクティス/アプローチ

分類Dev

Webアプリケーションからデータベースにアクセスするためのベストプラクティス

分類Dev

Azure ActiveDirectory-アクセストークンを保存するためのMVCアプリケーションのベストプラクティス

分類Dev

Spring Bootアプリケーション全体でクラスのインスタンスを共有する

分類Dev

AmazonにSpringBootアプリケーションをデプロイするためのベストプラクティス

分類Dev

大きなアプリケーションでルーティングを指定するためのベストプラクティス

分類Dev

2つのマイクロサービス間でドメインモデルを共有するためのベストプラクティス

分類Dev

Java Swingデスクトップアプリケーションを国際化するためのベストプラクティスは何ですか?

分類Dev

アクションコントローラーLaravelで応答を定義するためのベストプラクティス

分類Dev

インスタンスプロパティを設定するためのES6クラスコンストラクタショートカット

分類Dev

ASP.NETアプリケーションでセッションを確認するためのベストプラクティス

分類Dev

FlutterアプリケーションのAndroidとiOSを配布するための最良の方法。Flutterベータ分布のベストプラクティス

分類Dev

複数のAutofacコンポーネントで共有されるアプリケーション全体の初期化のベストプラクティスは?(この場合はライセンスを使用してください。)

分類Dev

サーバーからAndroidアプリケーションにデータを送信するためのベストプラクティス

分類Dev

Dockerコンテナー内で実行されるJVMアプリケーションからグレイログにログを送信するためのベストプラクティスは何ですか?

Related 関連記事

  1. 1

    類似のWebアプリ間でWeb層コード(コントローラーとJSP)を共有するためのベストプラクティス

  2. 2

    最小限のダウンタイムでJava Webアプリケーションをデプロイするためのベストプラクティス?

  3. 3

    Androidアプリケーションでオンラインデータをクエリするためのベストプラクティス?

  4. 4

    WEBAPIサーバーとAndroidクライアントアプリケーション間でモデルを共有するためのベストプラクティスは何ですか

  5. 5

    Angularjsアプリケーションで$ rootscopeを使用するためのベストプラクティスは?

  6. 6

    nodejsコマンドラインアプリケーションを配布するためのベストプラクティス

  7. 7

    Net Core 2WebApiのアプリケーションインサイト-プロパティを追加するためのコンテキストの共有

  8. 8

    スプリングブートアプリケーションの値を格納するためのベストプラクティスは何ですか?

  9. 9

    WebアプリケーションでCRMに接続するためのベストプラクティス

  10. 10

    Go Webアプリケーションを更新するためのベストプラクティス

  11. 11

    Electronアプリケーションを保護するためのベストプラクティス

  12. 12

    $ resourceを使用し、複数のコントローラー間で結果を共有するためのベストプラクティスは何ですか?

  13. 13

    古いSpark1.2.0アプリケーションログをクリーンアップするためのベストプラクティス?

  14. 14

    Springでアプリケーション全体のデータを保持するベストプラクティス

  15. 15

    エンティティ間でFormTypeを共有する、ベストプラクティス/アプローチ

  16. 16

    Webアプリケーションからデータベースにアクセスするためのベストプラクティス

  17. 17

    Azure ActiveDirectory-アクセストークンを保存するためのMVCアプリケーションのベストプラクティス

  18. 18

    Spring Bootアプリケーション全体でクラスのインスタンスを共有する

  19. 19

    AmazonにSpringBootアプリケーションをデプロイするためのベストプラクティス

  20. 20

    大きなアプリケーションでルーティングを指定するためのベストプラクティス

  21. 21

    2つのマイクロサービス間でドメインモデルを共有するためのベストプラクティス

  22. 22

    Java Swingデスクトップアプリケーションを国際化するためのベストプラクティスは何ですか?

  23. 23

    アクションコントローラーLaravelで応答を定義するためのベストプラクティス

  24. 24

    インスタンスプロパティを設定するためのES6クラスコンストラクタショートカット

  25. 25

    ASP.NETアプリケーションでセッションを確認するためのベストプラクティス

  26. 26

    FlutterアプリケーションのAndroidとiOSを配布するための最良の方法。Flutterベータ分布のベストプラクティス

  27. 27

    複数のAutofacコンポーネントで共有されるアプリケーション全体の初期化のベストプラクティスは?(この場合はライセンスを使用してください。)

  28. 28

    サーバーからAndroidアプリケーションにデータを送信するためのベストプラクティス

  29. 29

    Dockerコンテナー内で実行されるJVMアプリケーションからグレイログにログを送信するためのベストプラクティスは何ですか?

ホットタグ

アーカイブ