Standard workflows for Azure Logic Apps でローカル関数を作成・実行

適用対象: Azure Logic Apps (Standard)

統合ワークフローが組み込み操作や既成コネクタ以外のロジックを必要とする場合は、コードがLogicアプリソリューションに特化した ローカル関数 を作成しましょう。 このローカル関数はカスタム.NETコードで、コーラーと同じAzure Logic Apps Standardプロジェクト内で作成、実行、デバッグ、デプロイを行います。 関数をローカルに保つことで、ワークフローとそのカスタムコードを一つのアプリとして開発、保護、展開、拡張、運用できます。

ローカル関数はワークフローが以下のタスクを実行するのに役立ちます:

  • カスタムのビジネスロジックと計算を実装しましょう。
  • 独自メッセージや複雑な受信メッセージを解析します。
  • データの検証、強化、または単純な変換を行うこと。
  • API、コネクタ、またはパートナーシステム向けにアウトバウンドメッセージをシェイプします。
  • 既存の統合ソリューションから適切な.NETヘルパーロジックを再利用し、BizTalk Serverの移行シナリオも含まれます。

局所関数を用いることで、以下の目標を達成できます:

ゴール 能力
一つのソリューションを開発・デバッグする ワークフローとローカル関数を同じVisual Studio Codeワークスペース内で作成し、1回のデバッグセッションで両方をステップで処理します。
まとめてデプロイ 別途サービスプランをプロビジョニングせずに、呼び出し元のワークフローと並行してローカル関数を構築し展開してください。
サービス境界を縮小する ワークフロー固有のコードのために、別途Functionアプリ、HTTPエンドポイント、認証フロー、ネットワークホップを避けましょう。
ローコードとプロコードのツールを組み合わせる 統合フローにはコネクターとワークフローオーケストレーションを使いましょう。 専門的な.NETロジックにはローカル関数を使いましょう。

ローカル関数は、Azure Functionsの別の関数アプリにホストされている関数とは異なります。 Azure Functionsは、コードが独立したエンドポイントを公開する必要がある場合、アプリ間で共有される場合、独自のデプロイやバージョン管理のライフサイクルを踏む場合、または独立してスケールする必要がある場合に最も効果的に機能します。 コードが特定のAzure Logic Apps Standardソリューション内で動作し、アプリケーションのライフサイクルを呼び出し元ワークフローと共有する必要がある場合は、ローカル関数を使いましょう。

このガイドでは、Visual Studio Codeを使ってStandardワークフロー向けにローカル.NET関数の作成、構築、呼び出し、デバッグ、デプロイ方法を紹介します。

注

局所関数は以下のシナリオには適していません:

  • 10 分を超える可能性があるプロセスの実行。
  • ストリーミングを実装したBizTalk Serverパイプラインコンポーネントを使用しています。

詳細については、「 制限事項」を参照してください。

前提条件

  • Azure アカウントとサブスクリプション。 無料のAzure アカウントを取得します。

  • Azure Logic Apps (Standard) 拡張子を持つ最新のVisual Studio Code。

    前提条件については、Visual Studio Code を使用したシングルテナント Azure Logic Appsの Standard ワークフローの作成に関するページを参照してください。

    拡張機能には、次の機能と利点があります。

    • 非常に困難な統合の問題を解決する柔軟性と制御性を備えた関数を作ることにより独自のコードを生成します。
    • Visual Studio Codeでコードをローカルでデバッグします。 同じデバッグ セッションでコードとワークフローをステップ実行します。
    • コードをワークフローと共にデプロイします。 他のサービス プランは必要ありません。
    • BizTalk Server移行シナリオをサポートして、カスタム .NET投資をオンプレミスからクラウドにリフト アンド シフトできるようにします。
  • コード プロジェクトに使用するローカル フォルダー。

制限事項

  • ローカル関数の作成はWindows上で動作するVisual Studio Codeでのみ可能です。 この機能は、Workflow Service Plan、App Service Environment v3(ASE v3)、またはハイブリッド上でホストされる標準ワークフロー向けに.NET Frameworkおよび.NET 8をサポートします。

  • Azure ポータルでカスタム関数の作成を使用することはできません。 ただし、ワークフロー内のカスタム関数からの出力を操作するには、次の手順に従います。

    1. Azureに関数をデプロイしたら、Azure ポータルの ワークフローからコードを呼び出す手順に従います。

    2. [このロジック アプリでローカル関数を呼び出す] という名前の組み込みアクションをワークフローに追加します。 デプロイするカスタム関数を選択し、コードを実行します。

    3. 他のワークフローと同様に、後続のワークフロー アクションを使用してカスタム関数の出力を参照します。 組み込みアクションの実行履歴、入力、出力が表示されます。

一般的な制限事項については、Limits と Azure Logic Appsを参照してください。

1: コード プロジェクトを作成する

Visual Studio Code の Azure Logic Apps (Standard) 拡張機能には、ワークフローを使用して独自のコードを記述、デバッグ、デプロイするための合理化されたエクスペリエンスを提供するコード プロジェクト テンプレートが含まれています。 このプロジェクト テンプレートは、ワークスペース ファイルと 2 つのサンプル プロジェクトを作成します。1 つはコードを記述するプロジェクトで、もう 1 つはワークフローを作成するプロジェクトです。

注

コードとワークフローの両方に同じプロジェクト フォルダーを使用することはできません。

コード プロジェクトを作成するには、次の手順に従います。

  1. Visual Studio Codeで、Azure アカウントにサインインします。

    サインインに通常よりも時間がかかる場合、Visual Studio Codeはデバイス コードを指定して、Microsoft認証 Web サイトを介してサインインするように求められます。 代わりにコードを使用してサインインするには、次の手順に従います。

    1. [ デバイス コードの使用] を選択し、[ コピーして開く] を選択します。

    2. [ リンクを開く ] を選択して新しいブラウザー ウィンドウを開き、認証 Web サイトに進みます。

    3. [アカウントにサインインする] ページで認証コードを入力し、 [次へ] を選択します。

  2. アクティビティ バーで、Azure アイコンを選択します。

  3. Azure ウィンドウで、Workspace セクションに移動します。 ツールバーが表示されるように、タイトル領域の上にポインターを移動します。

  4. Azure Logic Apps メニューの 新しいロジック アプリ ワークスペースの作成を選択します。

    Visual Studio Code、Azureウィンドウ、ワークスペースのツールバーメニュー(Create New Logic App Workspace を選択しています)が表示されるスクリーンショットです。

  5. [ フォルダーの選択] ウィンドウで、ローカル プロジェクト フォルダーを参照し、フォルダーを選択して 、[選択] を選択します。

  6. [ 新しいロジック アプリ ワークスペースの作成 ] ウィンドウの [ワークスペース名 ] プロンプトで、ワークスペースの名前を入力し、Enter キーを押します。

    この例では、ワークスペース名として weather-app を使用します。

    ワークスペース名の入力を促すプロンプトを示すスクリーンショットです。

  7. [新しいプロジェクトのテンプレートの選択] プロンプトで、カスタム コード プロジェクトを含むロジック アプリを選択します。

    新しいLogicアプリ作成のワークスペースプロンプトとテンプレートリスト、そしてカスタムコードプロジェクトでLogicアプリを選択するオプションを示しています。

  8. ターゲット フレームワークの選択 プロンプトで、.NET Framework または .NET 8 を選択します。

  9. 後続のプロンプトに従って、次の情報を指定します。

    プロンプト 値の例
    ロジック アプリ名 weather-logic-app
    .NET 関数プロジェクトのFunction 名 WeatherForecast
    Namespace .NET 関数プロジェクト用 Contoso.Enterprise
    プロジェクトの最初のワークフローのテンプレートを選択します。

    - ステートフル ワークフロー
    - ステートレス ワークフロー
    - 自律エージェント
    - 会話型エージェント
    - 今のところスキップする
    ステートフル ワークフロー
    ワークフロー名 weather-workflow
  10. [ プロジェクトを開く方法の選択 ] プロンプト で、[現在のウィンドウで開く] を選択します。

    この手順を完了すると、Visual Studio Codeワークスペースが作成されます。これには、.NET関数プロジェクトとロジック アプリ プロジェクトが既定で含まれます。次に例を示します。

    作成したワークスペースとLogicアプリプロジェクト、.NET関数プロジェクトを示したスクリーンショットです。

    [エクスプローラー] ウィンドウで、ワークスペース内の次のフォルダーに注意してください。

    Folder 説明
    < ワークスペース名> .NET関数プロジェクトとロジック アプリ ワークフロー プロジェクトの両方が含まれます。
    < ロジック アプリ名> ロジック アプリ プロジェクトのファイルとその他の成果物が含まれます。 たとえば、 workflow.json ファイルは、ワークフローを構築できるワークフロー定義ファイルです。
    < 関数名> .NET関数プロジェクトのファイルとその他の成果物が含まれます。 たとえば、< ファイルは、コードを作成できるコード ファイルです。
  11. <プロンプトで、Azure のコネクタを使用するを選択します。

  12. サブスクリプションの選択プロンプトで、必要なAzureサブスクリプションを選択します。

  13. [ 新しいリソースのリソース グループの選択 ] プロンプトで、目的のリソース グループを選択するか 、新しいリソース グループを作成します。

  14. 新しいリソースの場所を選択しますプロンプトで、デプロイするAzureリージョンを選択します。

  15. Azure コネクタの認証方法の選択で、認証が必要な接続に使用する認証の種類を選択します。

    認証の種類 説明
    マネージド ID ロジック アプリ リソースでシステム割り当て ID またはユーザー割り当て ID を使用するには、[ マネージド サービス ID] を選択します。

    既定では、Standard ロジック アプリ リソースでは、システム割り当て ID が既に有効になっています。 ただし、ターゲット リソースにロール アクセス権を持つ ID と、その他の要件を設定する必要があります。

    詳細については、「 マネージド ID へのロールベースのアクセスの割り当て」を参照してください。
    接続キー 接続文字列とアクセス キーを使用して、ターゲット リソースへのアクセスを設定します。

これらの手順を完了したら、次のセクションに進み、コードを作成できるようにします。

2: コードを記述する

  1. エクスプローラー ウィンドウで、関数プロジェクト フォルダーを展開し、<function-name>.cs ファイルを開きます。

    このファイルには、前に指定した値を含むサンプル コードと特定のコード要素が含まれています。

    この例では、 WeatherForecast.cs 関数ファイルには、値の例を含む次のコード要素が含まれています。

    Code 要素 価値
    名前空間名 Contoso.Enterprise
    クラス名 WeatherForecast
    関数名 WeatherForecast
    関数のパラメーター zipCode、temperatureScale
    の戻り値の型 : Task<Weather>
    複合型 Weather

    次の例は、完全なサンプル コードを示しています。

    //------------------------------------------------------------
    // Copyright (c) Microsoft Corporation. All rights reserved.
    //------------------------------------------------------------
    
    namespace Contoso.Enterprise
    {
        using System;
        using System.Collections.Generic;
        using System.Threading.Tasks;
        using Microsoft.Azure.Functions.Extensions.Workflows;
        using Microsoft.Azure.WebJobs;
        using Microsoft.Extensions.Logging;
    
        /// <summary>
        /// Represents the WeatherForecast flow invoked function.
        /// </summary>
        public class WeatherForecast
        {
    
            private readonly ILogger<WeatherForecast> logger;
    
            public WeatherForecast(ILoggerFactory loggerFactory)
            {
                logger = loggerFactory.CreateLogger<WeatherForecast>();
            }
    
            /// <summary>
            /// Executes the logic app workflow.
            /// </summary>
            /// <param name="zipCode">The zip code.</param>
            /// <param name="temperatureScale">The temperature scale (e.g., Celsius or Fahrenheit).</param>
            [FunctionName("WeatherForecast")]
            public Task<Weather> Run([WorkflowActionTrigger] int zipCode, string temperatureScale)
            {
    
                this.logger.LogInformation("Starting WeatherForecast with Zip Code: " + zipCode + " and Scale: " + temperatureScale);
    
                // Generate random temperature within a range based on the temperature scale
                Random rnd = new Random();
                var currentTemp = temperatureScale == "Celsius" ? rnd.Next(1, 30) : rnd.Next(40, 90);
                var lowTemp = currentTemp - 10;
                var highTemp = currentTemp + 10;
    
                // Create a Weather object with the temperature information
                var weather = new Weather()
                {
                    ZipCode = zipCode,
                    CurrentWeather = $"The current weather is {currentTemp} {temperatureScale}",
                    DayLow = $"The low for the day is {lowTemp} {temperatureScale}",
                    DayHigh = $"The high for the day is {highTemp} {temperatureScale}"
                };
    
                return Task.FromResult(weather);
            }
    
            /// <summary>
            /// Represents the weather information for WeatherForecast.
            /// </summary>
            public class Weather
            {
                /// <summary>
                /// Gets or sets the zip code.
                /// </summary>
                public int ZipCode { get; set; }
    
                /// <summary>
                /// Gets or sets the current weather.
                /// </summary>
                public string CurrentWeather { get; set; }
    
                /// <summary>
                /// Gets or sets the low temperature for the day.
                /// </summary>
                public string DayLow { get; set; }
    
                /// <summary>
                /// Gets or sets the high temperature for the day.
                /// </summary>
                public string DayHigh { get; set; }
            }
        }
    }
    

    この関数定義には、作業を開始するために使用できる既定の Run メソッドが含まれています。 このサンプル Run メソッドは、複雑な.NET型など、さまざまな入力と出力を渡すなど、カスタム関数機能で使用できるいくつかの機能を示しています。

    < function-name>.cs ファイルには、Application Insights リソースへのイベントのログ記録をサポートするILogger インターフェイスも含まれています。 Application Insights にトレース情報を送信し、その情報をワークフローからのトレース情報と共に格納できます。次に例を示します。

    private readonly ILogger<WeatherForecast> logger;
    
    public WeatherForecast(ILoggerFactory loggerFactory)
    {
        logger = loggerFactory.CreateLogger<WeatherForecast>();
    }
    
    [FunctionName("WeatherForecast")]
    public Task<Weather> Run([WorkflowActionTrigger] int zipCode, string temperatureScale)
    {
    
        this.logger.LogInformation("Starting WeatherForecast with Zip Code: " + zipCode + " and Scale: " + temperatureScale);
    
        <...>
    
    }
    
  2. サンプル関数コードを独自のコードに置き換え、特定のシナリオの既定の Run メソッドを編集します。 または、[FunctionName("<function-name>")] 宣言を含む関数をコピーし、関数の名前を一意の名前に変更することもできます。 その後、名前を変更した関数を、ニーズに合わせて編集できます。

この例では、変更がないと仮定して、元のサンプル コードを続行します。

3: コードをコンパイルしてビルドする

コードを書き終えたら、ビルドエラーがないかコンパイルしてください。 あなたの.NET関数プロジェクトには、コードをコンパイルしてLogicアプリプロジェクトのlib\customフォルダに追加するビルドタスクを自動的に含みます。 ワークフローはこのフォルダ内のカスタム関数を探します。 これらのタスクは、.NETのバージョンに応じて、アセンブリを lib\custom\net472 または lib\custom\net8 フォルダーに配置します。

次の手順に従います。

  1. Visual Studio Codeのアクティビティ バーで、Explorer を選択します。

  2. [エクスプローラー] ウィンドウで、Functions プロジェクト フォルダーのショートカット メニューを開き、[関数プロジェクトのビルド] を選択します。

    Build functionsプロジェクトのショートカットメニューと選択オプションが表示されたスクリーンショットです。

    ビルド タスクは、関数プロジェクトに対して実行されます。 ビルドが成功すると、[ ターミナル ] ウィンドウに [ビルドに成功しました ] というメッセージが表示されます。

  3. ロジック アプリ プロジェクトに次の項目が存在することを確認します。

    • ワークスペースで次のフォルダーを展開します: <your-logic-app>>lib\custom>net472 または net8、こちらは使用する .NET バージョンに基づきます。 net472またはnet8サブフォルダに、コードを実行するために必要なアセンブリ(DLL)ファイル、<function-name>.dllというファイルが含まれているか確認してください。

    • ワークスペースで、次のフォルダーを展開します: <ロジック アプリ>>lib\custom><function-name>。 < function-name>サブフォルダに function.json ファイルが含まれており、そのファイルにはあなたが書いた関数コードのメタデータが含まれています。 ワークフロー デザイナーは、このファイルを使用して、コードの呼び出し時に必要な入力と出力を判断します。

    次の例は、ロジック アプリ プロジェクトで生成されたアセンブリとその他のファイルの例を示しています。

    .NET関数とLogic Appプロジェクトを含むLogic Appワークスペースのスクリーンショットです。新たに生成されたアセンブリやその他の必要なファイルが見えます。

4: ワークフローからコードを呼び出す

コードがコンパイルされ、ロジック アプリ プロジェクトにコードを実行するために必要なファイルが含まれていることを確認したら、コードを呼び出すワークフローを設定します。

  1. エクスプローラー ウィンドウで、<workspace-name>、<logic-app-name>、および <workflow-name> を展開します。

  2. workflow.jsonのショートカット メニューを開き、[デザイナーを開く] を選択します。

    ワークフロー デザイナーが開き、次のトリガーとアクションを含む既定のワークフローが表示されます。

    Operation 説明
    Trigger HTTP 要求の受信時という名前の組み込み要求トリガー。
    アクション この ロジック アプリでローカル関数を呼び出すという名前の組み込みアクション。
    アクション 要求トリガーを使用する場合にのみ呼び出し元に応答するために使用する Response という名前の組み込み応答アクション。
  3. デザイナーで、[ このロジック アプリでローカル関数を呼び出す] という名前のアクションを選択します。

    アクションの情報ウィンドウが開き、次に例を示すカスタム関数呼び出しを設定できます。

    デフォルトのワークフローと、ワークフローデザイナーで開いたトリガーやアクションを示すスクリーンショットです。

  4. 関数名パラメーターの値が、実行する関数に設定されていることを確認します。 関数で使用するその他のパラメーター値を確認または変更します。

5: コードとワークフローをデバッグする

  1. 次の各Azure Storage サービスについて、Azurite ストレージ エミュレーターを起動します。

    • Azure BLOB サービス
    • Azure キュー サービス
    • Azure テーブル サービス
    1. Visual Studio Code View メニューから Command Palette を選択します。

    2. 表示されたプロンプトで、一覧から Azurite: Start Blob Service を選択します。

    3. 表示される作業ディレクトリの一覧から、ロジック アプリを選択します。

    4. [Azurite: Start Queue Service] (Azurite: Queue サービスの開始) と [Azurite: Start Table Service] (Azurite: Table サービスの開始) に対して、これらの手順を繰り返します。

    成功した場合は、画面の下部にある Visual Studio Code タスク バーに、実行中の 3 つのストレージ サービスが表示されます。

  2. 次の手順に従って、ロジック アプリ プロジェクトと.NET関数プロジェクトの両方にデバッガーをアタッチします。

    1. Visual Studio Codeのアクティビティ バーで、Run と Debug (キーボード: Ctrl + Shift + D) を選択します。

      Visual Studio Codeのアクティビティバーが「実行」と「デバッグ」を選択しているスクリーンショットです。

    2. [実行とデバッグ] の一覧で、[ローカル関数を使用したロジック アプリの実行/デバッグ] (<ロジック アプリ>) を選択し、[再生] (緑色の矢印) を選択します。

      ローカル機能付きのRun/DebugロジックアプリのRun/Debugリストと選択オプションが表示されたスクリーンショットです。

      次のイベントが発生します。

      • [Terminal] (ターミナル) ウィンドウが開き、デバッグ プロセスが開始したことを示します。
      • デバッグコンソールウィンドウが開き、デバッグ状況が表示されます。
      • Visual Studio Codeの下部で、タスク バーがオレンジ色に変わり、.NET デバッガーが読み込まれたことを示します。
  3. ブレークポイントを設定するには、関数定義 (<function-name>.cs) またはワークフロー定義 (workflow.json) で、ブレークポイントが必要な行番号を見つけて、隣接する列を選択します。次に例を示します。

    開いている関数コードファイルと、コードのラインインにブレークポイントを設定したスクリーンショットです。

  4. ワークフローで要求トリガーを手動で実行するには、ワークフローの [概要] ページを開きます。

    1. ロジック アプリ プロジェクトから、 workflow.json ファイルのショートカット メニューを開き、[ 概要] を選択します。

      ワークフローの [概要] ページには、ワークフローを手動で開始する場合のために [トリガーの実行] ボタンが用意されています。 [Workflow Properties] (ワークフローのプロパティ) の [コールバック URL] の値は、ワークフロー内の要求トリガーによって作成された呼び出し可能なエンドポイントの URL です。 この URL に要求を送信して、他のアプリ (他のロジック アプリ ワークフローなど) からワークフローをトリガーできます。

    2. [概要] ページのツール バーで、[トリガーの実行] を選択します。

      Visual Studio Codeとワークフローの開いた概要ページを示すスクリーンショットです。

      ワークフローの実行が開始されると、デバッガーによって最初のブレークポイントがアクティブになります。

    3. [実行] メニューまたはデバッガーのツール バーで、デバッグ アクションを選択します。

    ワークフローの実行が完了すると、[概要] ページに、完了した実行とその実行に関する基本的な詳細が表示されます。

  5. ワークフロー実行の詳細を確認するには、完了した実行を選択します。 または、[実行時間] 列の横にある一覧から [Show run] (実行の表示) を選択します。

    Visual Studio Codeとワークフローの実行完了を示すスクリーンショットです。

6: コードをデプロイする

ロジック アプリ プロジェクトをデプロイするのと同じ方法でカスタム関数をデプロイします。 Visual Studio Codeからデプロイする場合でも、CI/CDのDevOpsプロセスを使う場合でも、デプロイ前に必ずコードを構築してください。 また、展開前に以下のLogic Appプロジェクトフォルダにすべての依存アセンブリが存在することを確認してください:

  • .NET 4.7.2: lib/custom/net472 フォルダー

  • .NET 8: lib/custom/net8 フォルダー

詳細については、「 Visual Studio Code から Azureを参照してください。

依存関係の挿入

.NET 8 を選択すると、Standard ワークフローのカスタム .NET コードでは、dependency injection (DI) がサポートされます。 この機能を使用すると、サービスを 1 回登録できるため、各関数内に依存関係を作成するのではなく、実行時にカスタム コード関数でサービスを自動的に使用できるようになります。

注

Visual Studio Codeでサポートされているのは、.NET 8のカスタムコードプロジェクトのみで、依存性注入が可能です。

依存関係の挿入がない場合、多くの場合、カスタム コード関数は次のようになります。

  • 関数内にサービス インスタンスを直接作成します。
  • 複数の関数またはワークフロー間でロジックを複製する。
  • ビジネス ロジックとセットアップ コードと構成コードを組み合わせて使用します。

ワークフローが拡大するにつれて、カスタム コードのテスト、再利用、保守が困難になります。 依存注入を使うことで、以下が可能です:

  • ビジネス ロジックとワークフローの実行を分離します。
  • 複数のカスタム コード関数間で共有サービスを再利用します。
  • カスタム コードを標準の.NET開発パターンに合わせます。

カスタム コードは、特に複数のワークフローが同じロジックに依存している場合に、運用ワークフローでより管理しやすくなります。

依存関係の挿入を使用する場合

単純なカスタム コード関数または 1 回限りのカスタム コード関数がある場合は、おそらく依存関係の挿入は必要ありません。 ただし、カスタムコードに以下の要件がある場合は、依存性注入の使用を検討してください:

  • 複数のワークフローで、同じカスタム コード関数を使用または共有します。
  • カスタム コード関数には、時間の経過と同時に変化するビジネス ロジックまたはルーティング ロジックが含まれています。
  • より優れたテスト容易性または長期的な保守容易性が必要です。

依存関係の挿入がカスタム .NET関数に与える影響

依存関係の挿入では、カスタム .NET関数やワークフローの動作を呼び出す方法は変更されません。 この機能では、基になるカスタム コード構造のみが変更されますが、同じ結果が生成されます。 次の手順では、このプロセスについて説明します。

  1. Azure Logic Appsカスタム コード プロジェクトを読み込みます。
  2. Azure Logic Appsは、必要なサービスをインスタンス化し、登録し、関数に挿入します。
  3. この関数は、挿入された依存関係を使用して実行されます。

依存関係の挿入を有効にする

カスタム .NET コードで依存関係の挿入を使用するには、次の要件を満たします。

  1. カスタム コード プロジェクトを作成するときに、.NET 8 を選択します。

    依存関係の挿入をサポートするのは、.NET 8 個のカスタム コード プロジェクトのみです。

  2. プロジェクトで、依存関係の一覧を定義する StartupConfiguration クラスを追加します。 IConfigureStartup インターフェイスを実装し、IServiceCollectionを使用して依存関係を登録します。次に例を示します。

    using Microsoft.Azure.Functions.Extensions.Workflows;
    using Microsoft.Extensions.DependencyInjection;
    
    public class StartupConfiguration : IConfigureStartup
    {
        /// <summary>
        /// Configures services for the custom code function to use.
        /// </summary>
        /// <param name="services">The service collection to configure.</param>
        public void Configure(IServiceCollection services)
        {
            // Register the routing service with dependency injection
            services.AddSingleton<IRoutingService, OrderRoutingService>();
            services.AddSingleton<IDiscountService, DiscountService>();
        }
    }
    

    IConfigureStartupインターフェースはMicrosoft.Azure.Functions.Extensions.Workflowsで定義され、IServiceCollectionはMicrosoft.Extensions.DependencyInjectionで定義されています。 詳細については、 StartupConfiguration.csを参照してください。

  3. カスタム コード関数クラスコンストラクターで、登録されたサービスを、関数内に作成するのではなく、コンストラクター パラメーターとして定義して初期化します。次に例を示します。

    public class MySampleFunction
    {
        private readonly ILogger<MySampleFunction> logger;
        private readonly IRoutingService routingService;
        private readonly IDiscountService discountService;
    
        public MySampleFunction(ILoggerFactory loggerFactory, IRoutingService routingService, IDiscountService discountService)
        {
            this.logger = loggerFactory.CreateLogger<MySampleFunction>();
            this.routingService = routingService;
            this.discountService = discountService;
        }
    
        // Add your function logic here
    
    } 
    

カスタム コード プロジェクトをビルドして配置する以外に、依存関係の挿入を有効にするために、他の手順を実行したり、ワークフローを編集したり、Azure Logic Appsでその他のセットアップを変更したりする必要はありません。

詳細については、 カスタム コード依存関係挿入のサンプルを参照してください。

カスタムコードプロジェクトに独自のNuGetパッケージを持ち込む

.NET 8 を使用する NuGet ベースのカスタム コード プロジェクトでは、言語ワーカー ホストによって使用される依存関係との競合を解決することなく、独自の NuGet パッケージを含めて管理できます。 アセンブリの依存関係をプロジェクト内の別のアセンブリの場所に直接追加するだけです。 次の例外を除き、プロジェクトに必要な.NET 8 互換の依存アセンブリ バージョンを用意できます。

  • Microsoft.Extensions.Logging.Abstractions
  • Microsoft.Extensions.DependencyInjection.Abstractions
  • Microsoft.Azure.Functions.Extensions.Workflows.Abstractions

問題のトラブルシューティング

アクション情報ペインのエラー

ワークフロー デザイナーで、[Call a local function in this logic app] (このロジック アプリのローカル関数の呼び出し) という名前の組み込みアクションを選択すると、アクションの情報ペインに次のメッセージが表示されます。

Failed to retrieve dynamic inputs. Error details:

このシナリオでは、ロジック アプリ プロジェクトを調べて、 LogicApp\lib\custom フォルダーが空かどうかを確認します。 空の場合は、[ターミナル] メニューの [タスクの実行] を選択>関数をビルドします。

No process with the specified name is currently running (指定された名前のプロセスは現在実行されていません)

ワークフローの実行時にこのエラー メッセージが表示される場合は、ロジック アプリではなく、デバッガー プロセスを .NET Functions にアタッチしている可能性があります。

この問題を修正するには、[Run and Debug] (実行とデバッグ) の一覧で、[Attach to logic app (LogicApp)] (ロジック アプリ (LogicApp) にアタッチ) を選択し、[再生] (緑色の三角) を選択します。

パッケージが正しくインポートされない

[出力] ウィンドウに次のようなエラーが表示される場合は、少なくとも .NET 6.0 がインストールされていることを確認します。 このバージョンがインストールされている場合は、アンインストールしてから再インストールしてみてください。

C:\Users\yourUserName\.nuget\packages\microsoft.net.sdk.functions\4.2.0\build\Microsoft.NET.Sdk.Functions.targets(83,5): warning : The ExtensionsMetadataGenerator package was not imported correctly. Are you missing 'C:\Users\yourUserName\.nuget\packages\microsoft.azure.webjobs.script.extensionsmetadatagenerator\4.0.1\build\Microsoft.Azure.WebJobs.Script.ExtensionsMetadataGenerator.targets' or 'C:\Users\yourUserName\.nuget\packages\microsoft.azure.webjobs.script.extensionsmetadatagenerator\4.0.1\build\Microsoft.Azure.WebJobs.Script.ExtensionsMetadataGenerator.props'? [C:\Desktop\...\custom-code-project\MyLogicAppWorkspace\Function\WeatherForecast.csproj] WeatherForecast -> C:\Desktop\...\custom-code-project\MyLogicAppWorkspace\Function\\bin\Debug\net472\WeatherForecast.dll C:\Users\yourUserName\.nuget\packages\microsoft.net.sdk.functions\4.2.0\build\Microsoft.NET.Sdk.Functions.Build.targets(32,5): error : It was not possible to find any compatible framework version [C:\Desktop\...\custom-code-project\MyLogicAppWorkspace\Function\WeatherForecast.csproj] C:\Users\yourUserName\.nuget\packages\microsoft.net.sdk.functions\4.2.0\build\Microsoft.NET.Sdk.Functions.Build.targets(32,5): error : The specified framework 'Microsoft.NETCore.App', version '6.0.0' was not found. [C:\Desktop\...\custom-code-project\MyLogicAppWorkspace\Function\WeatherForecast.csproj] C:\Users\yourUserName\.nuget\packages\microsoft.net.sdk.functions\4.2.0\build\Microsoft.NET.Sdk.Functions.Build.targets(32,5): error : - Check application dependencies and target a framework version installed at: [C:\Desktop\...\custom-code-project\MyLogicAppWorkspace\Function\WeatherForecast.csproj]

CS1031およびCS1001エラーを伴うビルド失敗

関数に変数が含まれていない場合、コードをビルドすると、出力ウィンドウに次のエラー メッセージが表示されることがあります。

C:\Users\yourUserName\...\custom-code-project\Function\func.cs (24,64): error CS1031: Type expected [C:\Users\yourUserName\...\custom-code-project\Function\func.csproj]
C:\Users\yourUserName\...\custom-code-project\Function\func.cs (24,64): error CS1001: Identifier expected [C:\Users\yourUserName\...\custom-code-project\Function\func.csproj]

Build FAILED.

C:\Users\yourUserName\...\custom-code-project\Function\func.cs (24,64): error CS1031: Type expected [C:\Users\yourUserName\...\custom-code-project\Function\func.csproj]
C:\Users\yourUserName\...\custom-code-project\Function\func.cs (24,64): error CS1001: Identifier expected [C:\Users\yourUserName\...\custom-code-project\Function\func.csproj]

0 Warning(s)
2 Error(s)

この問題を解決するには、コードの Run メソッドに次のパラメーターを追加します。

string parameter1 = null

次の例は、Run メソッドのシグネチャがどのように表示されるかを示しています。

public static Task<Weather> Run([WorkflowActionTrigger] int zipCode, string temperatureScale, string parameter1 = null)

Visual Studio Code を使用して Standard ロジック アプリ ワークフローを作成します