Return 来自 Dynamics365 代码的自定义 DTO class activity
Return a custom-defined DTO class from a Dynamics365 code activity
我正在尝试创建一个可以从 Dynamics 世界之外调用的 Dynamics365 扩展,以获取一些数据。
我被告知要调查的第一种方法是在 Dynamics 中创建一个 "action" - 这需要在 C# 代码中创建一个 CodeActivity
,然后将其添加到 Dynamics 提供的 OData 提要中 - 听起来相当引人注目!
所以我尝试设置一个 CodeActivity
class 来处理我的任务——从调用者那里获取一个 ProjectId
(Guid) 和 Language
作为参数,并且然后在 Dynamics 内部,我将需要获取一些实体,从中提取一些信息,并将所有内容捆绑到我定义的 DTO class 中(它与 Dynamics 世界中的任何实体都不匹配 -所以这就是为什么我需要一个单独的 DTO class 来保存我需要提供的数据)和来自代码 activity.
的 return
我的 class 看起来像这样:
public class GetProject : System.Activities.CodeActivity
{
[RequiredArgument]
[Input("ProjectId")]
public InArgument<Guid> ProjectId { get; set; }
[Input("Language")]
public InArgument<string> Language { get; set; }
[Output("ProjectResponse")]
public OutArgument<WebPortalDto> Response { get; set; }
/// <summary>When implemented in a derived class, performs the execution of the activity.</summary>
/// <param name="context">The execution context under which the activity executes.</param>
protected override void Execute(CodeActivityContext context)
{
// TODO - implement logic
}
}
我能够编译程序集 - 但在使用插件注册工具注册后,我首先收到一个错误,指出不支持 InParameter #1 的数据类型(我认为这是 ProjectId
参数,使用 GUID 类型)- 好吧,我将其更改为字符串,没什么大不了的。
但我现在遇到了更大的问题:OutParameter #1 的数据类型也不受支持......查看我们项目中的所有其他代码 activity classes,我看到他们几乎都 return 编辑了 EntityReference
- 对内置 Dynamics 实体的引用。
但就我而言,我真的不能这样做。我必须 return 这个 DTO class (它主要包含一堆 INT 和 STRING 属性)。我如何从 Dynamics365 插件/代码 activity 做到这一点?
首先请记住,从 Dynamics 外部调用操作仍然需要 Dynamics 身份验证,它们不会被公开使用。
您可以考虑创建一个 Web 服务(由您在某处托管)或 Azure 函数来访问 Dynamics 数据和 return 您想要的输出。
如果您仍想继续执行操作和自定义工作流程activity,您只能使用可以使用的类型,因为您已经发现不能使用自定义对象,这是最佳选择在你的情况下将是 return 一个包含你的 DTO 的 JSON 的字符串。
Ps:Guid 不是有效类型,要在 Dynamics 中引用特定记录,您需要使用 EntityReference(即带有 Guid 和实体逻辑名称的 class)
我正在尝试创建一个可以从 Dynamics 世界之外调用的 Dynamics365 扩展,以获取一些数据。
我被告知要调查的第一种方法是在 Dynamics 中创建一个 "action" - 这需要在 C# 代码中创建一个 CodeActivity
,然后将其添加到 Dynamics 提供的 OData 提要中 - 听起来相当引人注目!
所以我尝试设置一个 CodeActivity
class 来处理我的任务——从调用者那里获取一个 ProjectId
(Guid) 和 Language
作为参数,并且然后在 Dynamics 内部,我将需要获取一些实体,从中提取一些信息,并将所有内容捆绑到我定义的 DTO class 中(它与 Dynamics 世界中的任何实体都不匹配 -所以这就是为什么我需要一个单独的 DTO class 来保存我需要提供的数据)和来自代码 activity.
我的 class 看起来像这样:
public class GetProject : System.Activities.CodeActivity
{
[RequiredArgument]
[Input("ProjectId")]
public InArgument<Guid> ProjectId { get; set; }
[Input("Language")]
public InArgument<string> Language { get; set; }
[Output("ProjectResponse")]
public OutArgument<WebPortalDto> Response { get; set; }
/// <summary>When implemented in a derived class, performs the execution of the activity.</summary>
/// <param name="context">The execution context under which the activity executes.</param>
protected override void Execute(CodeActivityContext context)
{
// TODO - implement logic
}
}
我能够编译程序集 - 但在使用插件注册工具注册后,我首先收到一个错误,指出不支持 InParameter #1 的数据类型(我认为这是 ProjectId
参数,使用 GUID 类型)- 好吧,我将其更改为字符串,没什么大不了的。
但我现在遇到了更大的问题:OutParameter #1 的数据类型也不受支持......查看我们项目中的所有其他代码 activity classes,我看到他们几乎都 return 编辑了 EntityReference
- 对内置 Dynamics 实体的引用。
但就我而言,我真的不能这样做。我必须 return 这个 DTO class (它主要包含一堆 INT 和 STRING 属性)。我如何从 Dynamics365 插件/代码 activity 做到这一点?
首先请记住,从 Dynamics 外部调用操作仍然需要 Dynamics 身份验证,它们不会被公开使用。
您可以考虑创建一个 Web 服务(由您在某处托管)或 Azure 函数来访问 Dynamics 数据和 return 您想要的输出。
如果您仍想继续执行操作和自定义工作流程activity,您只能使用可以使用的类型,因为您已经发现不能使用自定义对象,这是最佳选择在你的情况下将是 return 一个包含你的 DTO 的 JSON 的字符串。
Ps:Guid 不是有效类型,要在 Dynamics 中引用特定记录,您需要使用 EntityReference(即带有 Guid 和实体逻辑名称的 class)