Aracılığıyla paylaş


Windows'da Uygulama Eylemleri ile uzak dosyaları işleme

Bu makalede, Windows'ta Uygulama Eylemleri sağlayıcı uygulamasından bir bulut hizmeti sağlayıcısı tarafından barındırılan uzak dosyalar için desteğin nasıl uygulandığı açıklanmaktadır. RemoteFileActionEntity sınıfı tarafından C# ile temsil edilen RemoteFile varlık türü, dosyalar ve sürücüler için benzersiz kimlikler gibi birçok bulut dosya depolama sağlayıcısı tarafından kullanılan özellikler sağlar. Bu sayfadaki örnekler, bulut dosyası özelliklerine nasıl erişileceğini gösterir, ancak uzak dosyaları almaz veya işlemez çünkü bu tür işlemler farklı uygulamalar ve sağlayıcılar arasında farklılık gösterebilir. Eylemler için giriş ve çıkış olarak kullanılabilecek farklı varlık türleri hakkında daha fazla bilgi için bkz. Windows'da Uygulama Eylemleri için eylem tanımı JSON şeması.

Microsoft.AI.Actions kod oluşturmayı kullanarak uzak dosyaları işleme

Aşağıdaki örnek, kodunuzdaki .NET özniteliklerini temel alarak IActionProvider uygulamasını otomatik olarak oluşturan Microsoft.AI.Actions NuGet Paketini kullanan bir eylem sağlayıcısında uzak dosya desteğinin nasıl uygulanacağı gösterilmektedir ve eylemlerinizi temsil etmek için kesin olarak belirtilmiş sınıflar oluşturmanıza olanak sağlar. **Microsoft.AI.Actions NuGet paketini kullanarak eylem sağlayıcısı uygulaması oluşturma hakkında bilgi için bkz. Windows'ta Uygulama Eylemleri'ni kullanmaya başlama.

Bu eylem tarafından desteklenen bulut sağlayıcılarını belirtmek için WindowsActionInputCombination özniteliğinde where yan tümcesi kullanıldığını unutmayın. Eyleminizin desteklenmeyen senaryolar için kullanıcılara sunulmasını önlemek için bunun gibi where yan tümcelerini kullanmak her zaman iyi bir fikirdir.

[ActionProvider]
public sealed class MyActionsProvider
{
    [WindowsAction(Description = "Summarize a remote file", Icon = "ms-resource://Files/Assets/LockScreenLogo.png", UsesGenerativeAI = false)]

    [WindowsActionInputCombination(Description = "Summarize ${RemoteFileToSummarize}", 
        Inputs = ["RemoteFileToSummarize"], 
        Where = ["${RemoteFileToSummarize.SourceId} == 'Contoso.Cloud' || ${RemoteFileToSummarize.SourceId} == 'Fabrikam.Cloud'"])]
    public async Task<SummarizeRemoteFileResult> SummarizeRemoteFile([Entity(Name = "RemoteFileToSummarize")] RemoteFileActionEntity remoteFile, InvocationContext context)
    {
        var summary = "";
        var remoteFileContents = "";

        switch (remoteFile.SourceId)
        {
            case "Contoso.Cloud":
                // Retrieve the file contents using the properties used by the "Contoso" service 
                remoteFileContents = GetContosoCloudFile(remoteFile.AccountId, remoteFile.DriveId, remoteFile.FileId);
                summary = SummarizeFile(remoteFileContents);
                break;

            case "Fabrikam.Cloud":
                // Retrieve the file contents using the properties used by the "Fabrikam" service 
                remoteFileContents = GetFabrikamCloudFile(remoteFile.AccountId, remoteFile.SourceUri);
                summary = SummarizeFile(remoteFileContents);
                break;

        }

        
        var entityFactory = context.EntityFactory;

        return new SummarizeRemoteFileResult
        {
            Text = entityFactory.CreateTextEntity(summary)
        };
    }

    public record SummarizeRemoteFileResult
    {
        public required TextActionEntity Text { get; init; }
    }

Uzak dosya girişiyle JSON eylem tanımı

Aşağıdaki kod örneğinde RemoteFile varlığını kullanan bir eylem bildiren bir eylem tanımı JSON dosyası gösterilmektedir. JSON eylem tanımı dosyanızı otomatik olarak oluşturmak için Microsoft.AI.Actions NuGet kullanıyorsanız, önceki bölümde gösterildiği gibi eylemi uyguladıktan sonra dosya böyle görünür.

{
  "version": 3,
  "actions": [
    {
      "id": "ExampleAppActionProvider.MyActionsProvider.SummarizeRemoteFile",
      "description": "Summarize a remote file",
      "icon": "ms-resource://Files/Assets/LockScreenLogo.png",
      "usesGenerativeAI": false,
      "allowedAppInvokers" :  ["*"],
      "inputs": [
        {
          "name": "RemoteFileToSummarize",
          "kind": "RemoteFile"
        }
      ],
      "inputCombinations": [
        {
          "inputs": [
            "RemoteFileToSummarize"
          ],
          "where": [
            "${RemoteFileToSummarize.SourceId} == 'Contoso.Cloud' || ${RemoteFileToSummarize.SourceId} == 'Fabrikam.Cloud'"
          ],
          "description": "Summarize ${RemoteFileToSummarize}"
        }
      ],
      "outputs": [
        {
          "name": "Text",
          "kind": "Text"
        }
      ],
      "invocation": {
        "type": "COM",
        "clsid": "00001111-aaaa-2222-bbbb-3333cccc4444"
      }
    }
  ]
}

IActionProvider ile uzak dosyaları işleme

Bu bölüm, IActionProvider arabirimini el ile uygularken bir RemoteFile varlığını giriş olarak kabul eden bir eylemin nasıl uygulandığını gösterir. Ayrıca, projenize önceki bölümde gösterilen gibi bir eylem tanımı JSON dosyasını el ile eklemeniz gerekir. Microsoft.AI.Actions gode oluşturma özelliğini kullanmadan COM tabanlı eylem sağlayıcısı uygulama hakkında daha fazla bilgi için bkz. IActionProvider'ı el ile uygulama.

public IAsyncAction InvokeAsync(ActionInvocationContext context)
{
    return InvokeAsyncHelper(context).AsAsyncAction();
}

async Task InvokeAsyncHelper(ActionInvocationContext context)
{
    NamedActionEntity[] inputs = context.GetInputEntities();

    var actionId = context.ActionId;
    switch (actionId)
    {
        case "ExampleAppActionProvider.MyActionsProvider.SummarizeRemoteFile":
            var summary = "";
            var remoteFileContents = "";

            foreach (NamedActionEntity inputEntity in inputs)
            {
                if (inputEntity.Name.Equals("RemoteFileToSummarize", StringComparison.Ordinal))
                {
                    var remoteFile = (RemoteFileActionEntity)inputEntity.Entity;
                    switch (remoteFile.SourceId)
                    {
                        case "Contoso.Cloud":
                            // Retrieve the file contents using the properties used by the "Contoso" service 
                            remoteFileContents = GetContosoCloudFile(remoteFile.AccountId, remoteFile.DriveId, remoteFile.FileId);
                            summary = SummarizeFile(remoteFileContents);
                            break;

                        case "Fabrikam.Cloud":
                            // Retrieve the file contents using the properties used by the "Fabrikam" service 
                            remoteFileContents = GetFabrikamCloudFile(remoteFile.AccountId, remoteFile.SourceUri);
                            summary = SummarizeFile(remoteFileContents);
                            break;

                    }
                }
            }
            
            TextActionEntity result = context.EntityFactory.CreateTextEntity(summary);
            context.SetOutputEntity("Text", result);


            break;

        default:
            break;

    }
}