首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重构用IOrganizationService替换OrganizationServiceProxy的方法

如何重构用IOrganizationService替换OrganizationServiceProxy的方法
EN

Stack Overflow用户
提问于 2019-05-30 04:12:36
回答 4查看 628关注 0票数 1

我正在尝试重构我的代码,这样我就可以使用fakexrmeasy进行单元测试。

作为建议的重构提到的here的一部分,我尝试将IOrganizationService传递到我所有的类和方法中。但是,我的一些类使用了IOrganizationService没有的变量和方法,比如Timeout。我正在尝试找到一种重构的方法,在不丢失功能的情况下使用IOrganizationService。

这就是它在重构之前的存在方式。

代码语言:javascript
复制
class testClass () {

    public void testMethod(OrganizationServiceProxy service) {
        service.Timeout = new TimeSpan(0, 15, 0);
    }

}

这是在重构之后。我尝试将IOrganizationService强制转换为OrganizationServiceProxy,但伪造的服务上下文无法处理此强制转换。抛出异常。

代码语言:javascript
复制
class testClass () {

    public void testMethod(IOrganizationService service) {
        var serviceProxy = (OrganizationServiceProxy) service; //This breaks when given a fake context
        service.Timeout = new TimeSpan(0, 15, 0);
    }

}

我试过按照this post中的建议使用IOrganizationServiceFactory。问题是,factory.CreateOrganizationService()生成的是IOrganizationService,而不是OrganizationSeriviceProxy。

如何在不丢失功能的情况下重构以使用IOrganizationService而不是OrganizationServiceProxy?我猜我可能不得不以某种方式将IOrganizationService实现为OrganizationServiceProxy。

EN

回答 4

Stack Overflow用户

发布于 2020-01-28 21:10:57

有两个选项:

1)为了简单起见,重构您的代码,使其仅引用IOrganizationService,并且仅在测试中使用该代码,并保留TimeOut位未经过测试(超出重构函数的范围)

2)如果对超时属性进行单元测试确实是必要的,那么模拟您自己的OrganizationServiceContext类,并将FakeXrmEasy (IOrganizationService)生成的模拟服务传递给OrganizationServiceProxy的构造函数。下面是所有可用的构造函数的列表:

https://docs.microsoft.com/en-us/dotnet/api/microsoft.xrm.sdk.client.organizationserviceproxy.-ctor?view=dynamics-general-ce-9

票数 1
EN

Stack Overflow用户

发布于 2019-05-30 04:32:19

像这样的东西可行吗?

代码语言:javascript
复制
public class OrganizationServiceProxy : IServiceProxy
  {
    public int SomeProp
    {
      get
      {
        return 1;
      }

      set
      {
      }
    }

    public TimeSpan Timeout
    {
      get
      {
        return new TimeSpan();
      }

      set
      {
      }
    }

    public void SomeMethod()
    {
    }
  }
  public interface IServiceProxy : IOrganizationService
  {
    TimeSpan Timeout { get; set; }
  }

  public interface IOrganizationService
  {
    void SomeMethod();
    int SomeProp { get; set; }
  }

因为OrganizationServiceProxy实现了IServiceProxy (反过来又实现了IOrganizationService),所以您可以检查传入的对象是否实现了IServiceProxy接口,并在if中执行您的工作。

代码语言:javascript
复制
private void testMethod(IOrganizationService someService)
{
   if(someService is IServiceProxy)
   {
     IServiceProxy tempProxy = someService as IServiceProxy;
     tempProxy.Timeout = new TimeSpan();
   }
}
票数 0
EN

Stack Overflow用户

发布于 2019-05-30 16:10:47

我不确定这是否会有帮助,但这是我使用的

代码语言:javascript
复制
CrmServiceClient c = new CrmServiceClient(connectionstring); //various parameters available
(OrganizationServiceProxy) service = c.OrganizationWebProxyClient ?? c.OrganizationServiceProxy;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56367835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档