gpt4 book ai didi

c# - Dynamics 365 - 使用 IOrganizationService 创建 OrganizationServiceProxy

转载 作者:行者123 更新时间:2023-11-30 16:42:21 25 4
gpt4 key购买 nike

我有一个用于自定义实体的处理程序类(一些 sdk 请求在这里处理),并且这个处理程序在许多插件/类中被引用。必须通过管理上下文而不是调用用户来访问该实体。我们没有将“通过管理员 guid 创建”的服务传递给处理程序类,而是试图在处理程序类中模拟该服务。例如;

----- 插件内部 -----

IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));

// Instead of doing something like this;
var adminOrganizationService = factory.CreateOrganizationService(Guid.Parse("~ADMINGUID~"));
MyEntityHandler myEntityHandler = new MyEntityHandler(adminOrganizationService);
// Use myEntityHandler

// What i want to do is, calling my entity handler with the service of calling user;

MyEntityHandler myEntityHandler = new MyEntityHandler(factory.CreateOrganizationService(context.UserId));
// Use myEntityHandler

在我的实体处理程序中,通过首先将 IOrganizationService 实例的 CallerID 转换为 OrganizationServiceProxy 来更改它。

-----处理程序内部-----

private IOrganizationService service;

public MyEntityHandler(IOrganizationService organizationService)

{
// This is what i have tried.
service = organizationService;
(service as OrganizationServiceProxy).CallerId = Guid.Parse("~ADMINGUID~");
}

我得到“异常:System.NullReferenceException:对象引用未设置到对象的实例。”在类型转换部分。有没有办法做这样的事情。我希望我自己解释得足够好,谢谢...

最佳答案

这并不能正常工作,因为传递给插件的对象不是 OrganizationServiceProxy,它在某些外部应用程序中使用,但在插件中没有使用。插件中的对象因隔离模式而异,据我所知,对于非隔离模式,它是 Microsoft.Xrm.Extensibility.InprocessProxyService ,对于沙盒模式,它是 Microsoft.Crm .Sandbox.SandboxOrganizationServiceWrapper。这两种类型都没有在 SDK 中,因此您只能通过反射访问它们的属性。第一个具有 CallerId 属性,因此您应该能够使用反射访问它,但第二个没有,因此我认为不可能替换此调用者 ID。

您应该采取的唯一有效方法是将 IOrganizationServiceFactory 传递给您的处理程序而不是 IOrganizationService,然后根据您的需要创建 IOrganizationService .如果你不想改变你的整个项目结构(我认为这是最好的方法,但我已经知道人们害怕重构,没有充分的理由,我们最终会在笨拙的项目中重写之后几年这样的维护)只需为您的处理程序创建第二个构造函数,它将 IOrganizationServiceFactory 作为参数 - 这将保持您现有代码的完整性,并且在您需要同时使用 admin 和 not- 的处理程序中管理服务,您只需使用第二个构造函数。

public class MyHandler
{
private IOrganizationService service;
private IOrganizationService adminService;

public MyHandler(IOrganizationService service)
{
this.service = service;
}

public MyHandler(IOrganizationServiceFactory factory, Guid userId) //instead of passing userId here, it would be better to pass it to the method that you want to perform
{
this.service = factory.CreateOrganizationService(userId);
this.adminService = factory.CreateOrganizationService(null);
}
}

或者简单地说:

public class MyHandler
{
private IOrganizationService service;
private IOrganizationService adminService;

public MyHandler(IOrganizationService service)
{
this.service = service;
}

public MyHandler(IOrganizationService service, IOrganizationService adminService) : this(service)
{
this.adminService = adminService;
}
}

这只是一个例子,当然我对你的架构了解不多,但可以肯定的是,这种方法在未来会比你现在尝试做的更好、更干净、更容易维护(因为没有很好的理由,再次 - 不要害怕重构代码,大部分工作会为你做 Visual Studio...)

关于c# - Dynamics 365 - 使用 IOrganizationService 创建 OrganizationServiceProxy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46949754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com