問題タブ [cross-cutting-concerns]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
2908 参照

architecture - アプリケーション内のロギングをどのように設計すればよいですか?

だから私はこれについて多くの研究をしましたが、「はい、それ」と言った答えは見つかりませんでした. 知識豊富な StackOverflow の皆さんが私を助けてくれることを願っています。

いくつかの異なるシナリオでこの問題に遭遇しました。C# アプリがあり、ログに記録したい重要なものがあるとします。

私が興味を持っているのは、どこloggerから取得するかです。

私が見ているように、私にはいくつかのオプションがあります。

  1. コンストラクターで MyClass に注入します。
  2. グローバルに利用可能なサービス ロケーターを使用して取得します。
  3. メソッド デコレーターと AOP を使用して、ログを記録します。

これらはどれも素晴らしいオプションのようには見えません。#3 は、メソッド呼び出し、入力パラメーター、および/またはスローされた例外の単純なトレースを行うだけでなく、ビジネス ロジックの途中でログを記録しているため、不可能に見えます。#2、単純に思えますが、単体テストは本当に難しいようです。もちろん、すべてを単体テストしたいと思います。#1 は問題なく動作しますが、ビジネス オブジェクト自体とは関係のないログ オブジェクトですべてのビジネス ロジックがごちゃごちゃになります。

上記のオプションのいずれかについて、代替案や考えはありますか? どうもありがとう!

編集:明確にするために、私はすでにDIの方法を知っており(Unityを使用しています)、優れたロギングフレームワークをすでに知っています(log4netを使用しています)。アプリケーション全体でアーキテクチャの意味でロギングを最もスマートな方法で使用する方法を考えてみてください。


* 編集 *

Mark Seeman の回答を解決策としてマークしました。アプリケーションを調べてみたところ、ロギング呼び出しのほとんどがデコレータと同じことを行っていることがわかりました。つまり、メソッドへのエントリ、スローされた例外をログに記録し、戻り値を終了します。

メソッド内で直接ログを記録する必要がある場合もありました。例は、何も返さないがException をスローしないメソッドで高速に失敗したい場合です。LogProviderそのような場合、名前付きログ インスタンスを取得する参照 a を保持するシングルトンがあります。コードは次のようになります。

LogProviderFactory にはSetProvider、シングルトンを交換できるメソッドがあります。したがって、単体テストでは次のことができます。

ロギング デコレータはシングルトンと同じ LogProvider (インジェクションによって取得) を使用するため、ロギングはシステム全体で統一されます。

したがって、最終的な解決策はほとんどがオプション 3 であり、ハイブリッド 2 でした (サービス ロケーター パターンですが、サービスはロケーターに「注入」されます)。

AOP

「アスペクト指向プログラミング」に関する限り、私は言語の限界に少しがっかりしました。AOP が将来のリリースで第一級市民として扱われることを願っています。

  • PostSharp を試しましたが、自分のマシンで正しく実行できませんでした。さらに、システムに PostSharp をインストールして使用する必要があるという大きな制限がありました (ソリューションに付属の dll などを呼び出すだけではありません)。
  • 私は LinFu を使用し、部分的に機能させることができました。ただし、いくつかの例で爆発しました。新しい 2.0 リリースはほとんど文書化されていないため、それがハードルでした。
  • ただし、Unity とのインターフェイス インターセプトは、そのままで問題なく機能するようです。ログに記録したいもののほとんどがインターフェイスを実装するクラスにあったことは幸運でした。
0 投票する
2 に答える
1298 参照

security - セキュリティなどの横断的関心事を適用するCQRS

大きな木が人がいる複雑なシステムがあるとします。単純な考えは従業員/マネージャーの関係であり、多くの従業員が1人のマネージャーに報告します。現在、マネージャーに加えて、マネージャーに代わって行動することができるサポートスタッフがマネージャーの従業員を操作することができます。

CQRSシステムでは、アクションの呼び出し元がサポートスタッフである、「従業員の編集」という架空のアクションのメッセージをどのようにモデル化しますか。このアクションは、マネージャーのセキュリティ関係に従ってスタッフが自分の領域の従業員に作用している場合にのみ成功します。

これのセキュリティを検証するには、データベースにクエリを実行して、変更される人物が実際にそのマネージャーの従業員チェーン内にいることを検証する必要があります。

このクエリはどこで発生しますか?「従業員の編集」メッセージを発信する前に?

メッセージを発信する前にデータが事前に検証されている場合、結果整合性のあるシステムでは、「従業員の編集」メッセージが処理される前に、「従業員の編集」アクションを完了するためのユーザーの権限を削除する別のアクションが発生したと想定します。 。コマンドハンドラーがそのメッセージのセキュリティ上の懸念を検証しない場合、ユーザーがメッセージを実行する権限を失っても、メッセージは引き続き成功します。

これは、UI検証やサーバー側検証と同様に、両面検証が最善の行動であることを意味しているように思われます。ただし、その検証を完了する方法は、CQRSの主要な信条に違反しているように見えます。

CQRSを使用するときに、これらおよび他の同様の横断的関心事に対処する必要がある場合、どのアプローチが最適ですか?

0 投票する
0 に答える
188 参照

aop - コンテキスト(ApplicationContext)を引数としてlogBefore Method(Aspectのメソッド)に渡す方法は?

遅延読み込みの問題を回避するアスペクトを実装したい。では、logBefore メソッドの引数として context(Application Context) を渡す方法は? 署名ポイントカットは、上記のメソッド (「???」を作成する場所) を定義し、このメソッド (logBefore) が結果タイプとして「Set」および「slm. aoa.buisiness.facade」をパッケージとして

ご協力ありがとうございます。

0 投票する
2 に答える
2246 参照

dependency-injection - 依存性注入 + アンビエント コンテキスト + サービス ロケーター

最近、DI、SL アンチパターン、AOP など、アプリケーションの設計パターンに関する多くの記事を読んでいました。この理由 - 私は設計の妥協点を見つけたいと思っています: 疎結合で、クリーンで、使いやすいです。DI は、コンストラクターまたはプロパティの汚染につながるクロスカッティングとオプションの依存関係という 1 つの問題を除いて、ほぼ解決策のようです。だから私はこれに対する私自身の解決策を持ってきて、あなたがそれについてどう思うか知りたい.

マーク シーマン (DI 本の著者であり、有名な「SL はアンチ パターン」という声明の著者) は、その本の中で、アンビエント コンテキストと呼ばれるパターンについて言及しています。あまり好きではないと彼は言いますが、このパターンは依然として興味深いものです。スコープがあり、デフォルト値を提供するため、null をチェックする必要がないことを除けば、古き良きシングルトンのようなものです。それには 1 つの欠陥があります - それはありませんし、そのスコープと自分自身を処分する方法について知ることができません。

では、ここで Service Locator を適用してみませんか? Ambient Context オブジェクトのスコーピングと破棄の両方の問題を解決できます。アンチパターンだと言う前に: コントラクトを隠すときです。しかし、私たちの場合、OPTIONAL コントラクトを非表示にしているので、IMO はそれほど悪くありません。

ここに私が何を意味するかを示すいくつかのコードがあります:

編集:具体的な質問をしないことは、スタックオーバーフローの設計と矛盾することを認識しています。したがって、この設計が悪い理由を最もよく説明している投稿を回答としてマークし、より良い解決策(または追加?)を提供します。しかし、AOP を提案しないでください。それは良いことですが、コード内で本当に何かをしたい場合には解決策ではありません。

編集 2: ServiceLocator.Current is null のチェックを追加しました。SL が構成されていない場合に既定の設定で動作するようにすることが、私のコードで意図していることです。

0 投票する
2 に答える
1541 参照

c# - ASP.NET MVC 3 アプリケーションで分野横断的な問題を処理する方法は?

次のようなさまざまなコンポーネント/レイヤーを備えた ASP.NET MVC 3 Web アプリケーションがあります。

  1. ウェブ
  2. サービス (キャッシュ、外部 API、クラウド サービスなど)
  3. コア (ドメイン ロジック、POCO など)
  4. リポジトリ (エンティティ フレームワーク)

今、私が自分のウェブサイトで何かをするとき (たとえば、フォームを送信する、別名 POST) - 最悪の場合、すべてのレイヤーに通知する必要があるかもしれません。

これで、このすべてのロジックをコントローラーの HTTP POST アクションに組み込むことができましたが、ロジックが非常に重くなります。

パブリッシャー-サブスクライバー パターン (AOP) の使用に手を出しましたが、まだ非常に優れた .NET 実装を見つけていません。また、これは Web アプリケーションの適切な方法ではないと言う人もいます。

誰でもここでアドバイスをもらえますか、または次のようなコードで立ち往生していますか?

ここでは、マルチスレッドなどについて話しているのではなく、単純にコントローラーの責任を取り除き、これらのアクションを処理するコンポーネントに責任を負わせます。

0 投票する
1 に答える
219 参照

asp.net-mvc - WebフォームでMVCフィルター属性を使用できますか?

AOP、別名横断的関心事をMVCの属性で処理したいと思います。
AOPフレームワークまたはインターセプトプラグインを備えたNinjectのようなものを使用する必要がありますか?

0 投票する
4 に答える
761 参照

c# - シリアル化属性をクラスやプロパティに装飾したり、データを永続化するためのインターフェイスを実装したりする必要があるのはなぜですか?

私の理解では、シリアライゼーション/デシリアライゼーション手法のほとんどは、リフレクションを使用してオブジェクトを作成し、値を設定または取得します。では、[XmlIgnore]... xml、[Serializable]... バイナリ シリアライゼーション、[JsonPropery]... Json.Net などの属性をクラスで明示的にバインドするのはなぜですか。これらはオブジェクトに関する限り横断的な懸念のようなものなので、オブジェクトの外で同じことを行うことはできませんか?

懸念事項が分離されている場合、ユーザーは、オブジェクト グラフ/ツリーのどの部分をどのコンテキストでどのようにシリアライズ/デシリアライズする必要があるかなどを制御できますか?

シリアライゼーション全体を側面として、つまりクラスの関心の外にするようなフレームワークはありますか?

Edit1:私の要件は次のとおりです。私のアプリケーションは、データを巨大なツリー構造に格納します。顧客の要件は、特定のデータを xml 形式でシリアル化し、データの特定の部分を Json でシリアル化できるようにすることであり (なぜそのような要件が必要なのかわかりません)、ほとんどのデータをレガシー コードとしてバイナリでシリアル化しています。

データの一部を XML 形式で表示する必要があるクラスと、別の部分 (これらは xml データまたはバイナリ シリアル化データの一部である場合もあります) を Json で表示する必要があるクラスがあります。

だから私は解決策を探しています

  1. クラスは、シリアライゼーション固有の属性を認識する必要はありません。代わりに、シリアライザー フレームワークは、クラスに触れずにシリアライゼーションを簡単に行うための十分なツールを提供できます。
  2. フレームワークは、私が望んでいたプライベート データとパブリック データの両方を永続化できるようにする必要があります。これは、クラスまたはインスタンスに固有の場合もあれば、あるコンテキストのインスタンスの一部のプロパティに固有の場合もあります。
    例えば
    • SaveTemplate: ツリーの各ブランチからいくつかのノードのみを保存する必要があります
    • SaveDocument: ツリーから 1 つのブランチを完全に保存する必要があります
    • SavePackage: ツリー全体を保存する必要があります。
  3. さまざまな目的で、xml、バイナリ、json などのさまざまな形式にシリアル化できるようにする必要があります。

そのため、特定のシリアル化フレームワークを評価して同じことを達成することを計画しています。私は次のことができるJson.Netを見つけました

  • xml serializationのように、パブリック プロパティにシリアル化タグを配置する必要はありません。
  • Binary Serialization への下位互換性。つまり、バイナリ シリアライゼーション インターフェイスの実装を変更する必要はありません。
  • パラメーターのないコンストラクターは必要ありません。

ただし、上記の 2) と 3) で述べた機能はまだ必要です。Json.Net やその他のフレームワークについてはまだ詳しく調べていません。

同じことを達成するのに役立つフレームワークはありますか?

0 投票する
3 に答える
2127 参照

c# - CRM 2011 プラグインのスレッド化/アンビエント コンテキスト

最近、Dynamics CRM 2011 で 1 つのプラグインの実行 (つまり、Execute()メソッドのパス) が同じスレッドにとどまることが保証されているかどうかという質問がいくつか出てきました。

Ambient Context パターンを使用してトレースを実装し、トレースが必要なクラスにトレース サービスを渡さないようにしたいと考えています。問題は、私たちが知っているように、プラグインは登録されたステップごとに 1 回だけインスタンス化され、同じインスタンスから後続のすべての操作を提供することです。つまり、現在のインスタンスTracing.Currentを割り当てるような静的プロパティを持つことはできず、問題ありません。ITracingService私がそれを行った場合、最後に開始された操作は、まだ実行されている可能性のある他のすべての操作のインスタンスを上書きします (この種の同時実行は珍しくありません)。

メソッドの下のすべてが同じスレッドに残っていることを確認できれば、静的フィールドExecute()の属性を利用してアンビエント コンテキストを使用できます。[ThreadStatic]

メソッドに入るとこれを設定Execute()し、最後にクリアして、トレース サービス インスタンスへの参照が削除されるようにします。

MSCRMプラグインのコンテキストでのスレッド化について私が知ることができる唯一のことは、明らかに個々のスレッドがThreadPoolから来ているということです.

MSCRM プラグインでスレッド化がどのように処理されるか、またはこの特別なケースで SOLID コードを使用してトレースの分野横断的な懸念をどのようにエレガントに処理できるかについての他のアイデアを持っている人はいますか (AOP/動的傍受はここではオプションではありません)?

ヘルプとポインタをありがとう。

0 投票する
1 に答える
213 参照

php - 関数を PHP で拡張して、さらに行を挿入することはできますか?

カスタム フレームワーク用に開発しているイベント システムのアイデアがあります。

このような疑似関数を想像してください。

さらにいくつかの関数に対して同じことを行う必要があると想像してください。(実行時に実行された関数をログに記録し、それらを別のファイルに記録したい場合があります。)

これを行ってイベントを手動で関数に追加する代わりに、このようなことを行うことはできますか?

アイデアは、hi()内部にある関数を注入し、外部から関数Test classに渡すものを注入することです。は、注入がターゲット関数の最初の行にある必要があることを意味します。extend'before'

最後に、イベントとイベント バインディングは関数から完全に抽象化された状態に保たれます。関数を変更せずにカスタムのものをバインドできるようにしたい。

eval()をハッキングしたり、いじったりすることで、これを行うことができると思いますcall_user_func()。よくわかりませんが。使用eval()はすでにかなり悪い音です。

私の質問は;

  1. PHPでできることはありますか?
  2. OOP/OOP Principles に名前があるので、さらに読むことができますか?
  3. それは意味がありますか、それとも悪い考えですか?