慣性聚合 関心のあるブログ、ニュース、テクノロジーを効率的に追跡
原文を読む 慣性聚合で開く

おすすめ購読元

博客园 - 司徒正美
V
V2EX
T
Tailwind CSS Blog
有赞技术团队
有赞技术团队
aimingoo的专栏
aimingoo的专栏
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
Blog — PlanetScale
Blog — PlanetScale
A
About on SuperTechFans
月光博客
月光博客
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
博客园 - 聂微东
The GitHub Blog
The GitHub Blog
V
Visual Studio Blog
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python)
D365 F&Oにおける命令連鎖:3つの生産上の落とし穴
SapotaCorp · 2026-05-24 · via DEV Community

チェーン・オブ・コマンドは、F&Oカスタマイズのデフォルトパターンになりました。オーバーレイアプローチは持続不可能だったため - すべてのOne Versionアップデートで何かが壊れ、パートナーはアップグレード予算を使って、設計で前向き互換性があったはずのカスタマイズを修復するのに費やしていました。CoCは、拡張機能がnext()でベースメソッドをラップし、全くオーバーレイダンスをスキップできるようにします。

その仕組みを読むのに1分かかる。3つの失敗モードが生産で頻繁に発生し、記録される。

誤解1:拡張時にnext()を忘れる

CoCに慣れていないチームは、このような検証拡張を書くことがよくある:

[ExtensionOf(tableStr(SalesTable))]
final class SalesTableExt_Extension
{
    public boolean validateWrite()
    {
        if (this.CustomCheck == NoYes::No)
        {
            return checkFailed("Custom check failed");
        }
        return true;
    }
}

フルスクリーンモードを開始 フルスクリーンモードを終了

バグ:なしnext validateWrite() を呼び出す。基本メソッドは実行されないため、すべての在庫検証が静かに無効になる。カスタムチェックパスのみをテストするユニットテストはパスする。不足している基本検証は、基本が拒否するはずのデータが本番に到達するまで現れない。

ロジックを追加するのではなく置き換える意図がある場合、まず next() を呼び出し、結果を組み合わせる:

public boolean validateWrite()
{
    boolean ret = next validateWrite();
    if (ret && this.CustomCheck == NoYes::No)
    {
        ret = checkFailed("Custom check failed");
    }
    return ret;
}

フルスクリーンモードに入る フルスクリーンモードを終了します

スキップしていますnext()は時には正当です - しかし意図的に、コメント付きで、レビューされるべきです。意図せずスキップすると、静かなデータ整合性バグが潜んでいます

誤解2:間違ったライフサイクルフックを選ぶ

FormDataSource.init()はレコードが読み込まれる前に実行されます。拡張コードが読み込むthis.cursor() またはレコードコンテキストが記録されると例外が発生するか、予測不可能な動作をします。ダイナミックフィルターを配信しているチームは、それが最初に見つかったフックにロジックを配置するため、空のデータセットを持つユーザーがフォームを開いた最初のときにクラッシュが発生することがあります。init()

フォームレベルのライフサイクルフックはそれぞれ目的があります:

  • init() - フォームレベルのセットアップ、まだデータがない
  • executeQuery() - クエリが構築された後、フェッチの前に
  • active() - データソース上で記録がアクティブになった後に
  • イベント前後のハンドラとして executeQuery - クエリを変更する最もクリーンな方法として基底を上書きせずに

パラメータテーブルから動的なフィルタリングを行う場合、executeQueryのイベント前ハンドラを使用して、イベント引数を通じて利用可能なデータコンテキストでクエリの範囲を変更できます。クラッシュなし、基底メソッドの上書きなし、脆い下游の結合なし。

陷陥3:プライベートまたは保護メンバーにアクセスしようとする

CoC拡張機能は基底クラスのプライベートまたは保護メンバーにアクセスできません。オーバーレイ時代のF&Oから移行してきた開発者は最初にこの問題に直面します:

[ExtensionOf(classStr(SalesLineType))]
final class SalesLineTypeExt_Extension
{
    public boolean checkPrice()
    {
        // Compile error: _commonPricing is protected
        return this._commonPricing.checkMyThing();
    }
}

フルスクリーンモードに入る フルスクリーンモードから退出する

マイクロソフトの拡張機能フレームワークドキュメントには4つのオプションが記載されています

  1. フック可能な基本メソッド - 私的有効な行為が公開メソッドを通じて表面化している場合、そのメソッドを呼び出す.
  2. 兄弟クラスアクセス - 偶然、公開クラスが必要なものを十分に公開することがある.
  3. データをargsを通じて公開するメソッド上のイベントハンドラ - 最もクリーンなパス.
  4. LCS問題検索を通じてアクセスを要求 - Microsoftは、連続するOne Versionリリースにおけるパートナーの要請に応じて多くのメンバーを開放しました。

反射を求めるのは間違いです。次のコンパイルでメンバーのレイアウトが変わるまで動作しますが、それ以降はオーバーレイレベルの脆弱性に戻ってしまいます。

静かな拡張機能のデバッグ

最イライラするCoCの失敗は、コンパイルされ、デプロイされるが、実行時には何もしない拡張機能です。機能しているF&Oコードベースのレビューで現れる根本原因:

  • [ExtensionOf]属性が間違ったターゲットを指している - formStr() / tableStr() / classStr()のタイプミス.
  • 拡張機能クラスがfinalではない - CoCに必要です。
  • メソッドのシグネチャが完全に一致しません - パラメータの型が一致しない場合は無視されます.
  • 拡張を含むモデルはターゲット環境のモデルリストにありません.

最初の診断手順:メソッドの上部で info("hit") を削除し、再コンパイルし、シナリオを実行し、Infolog を確認します。何も表示されない場合、上記のいずれかが間違っています.

コードレビューは保険として

健全なF&Oコードベースを運用しているチームは、CoC拡張機能に対してPR時のチェックリストを使用します:next()が正しく呼ばれているか、適切なライフサイクルフックが選択されているか、プライベートメンバーアクセスの試みがないか、SysTestによるユニットテストのカバレッジがあるか。PRごとに15分の時間は、One Versionアップデートが週末の停電に変わるのを防ぐ保険政策です。