2017-02-23 1 views
0

.NET 프로젝트에서 우리는 Dynamics SDK (버전 8.2.0.2)를 사용하여 웹 사이트에서 Dynamics 365에 액세스합니다. CrmSvcUtil 도구를 사용하여 작업 할 초기 바인딩 클래스를 생성했습니다. 우리는 IOrganizationService 대한 요구가 요청 될 때마다 동성 연결을 주입된다 의존도 리졸버에"폐기 된 개체에 액세스 할 수 없습니다."

로서 다음

역학과 통신을 다루는 우리 클래스
container.For<IOrganizationService>() 
      .Singleton() 
      .Use(ctx => new OrganizationService(new CrmConnection("CrmConnection"))); 

우리 생성자 갖도록 만들어 다음과 같이 IOrganizationService의 인스턴스가 삽입됩니다.

 private readonly IOrganizationService _organizationService; 
    private readonly ILog _logger; 

    public CrmAccount(IOrganizationService organizationService, ILog logger) 
    { 
     _organizationService = organizationService; 
     _logger = logger; 
    } 

이 클래스에는 다양한 방법이 있습니다. 하나는 예를 들어 사용자 연락처 레코드를 업데이트합니다. 나는 우리가 업데이트하고 모든 속성을 표시되지 않는이 게시물 즉, 메신저의 목적을 위해 작은 방법을했습니다,하지만 코드의 구조는 동일하게 유지 :

 public Guid? SetProfile(string username) 
    { 
     using (var xrm = new XrmServiceContext(_organizationService)) 
     { 
      //check whether account already exists 
      var crmProfile = GetContact(xrm, username); 

      if (crmProfile == null) 
      { 
       //create new account if required 
       crmProfile = new Contact 
       { 
        EMailAddress1 = profile.Username, 
       }; 
       xrm.AddObject(crmProfile); 
      } 
      else 
      { 
       //update existing account 
       crmProfile.EMailAddress1 = profile.Username; 
       xrm.UpdateObject(crmProfile); 
      } 

      var response = xrm.SaveChanges(); 

      if (!response.HasError) return crmProfile.Id; 
      foreach (var result in response) 
      { 
       if (result.Error != null) 
       { 
        _logger.ErrorFormat("Failed to create Profile record for Profile with guid {0}:/r/n{1}", crmProfile.Id, result.Error.Message); 
       } 
      } 

      return crmProfile.Id; 
     } 
    } 

우리가보고있는 문제입니다 여러 사용자가 동시에이 메서드를 호출 할 때마다 xrm.SaveChanges() 메서드가 호출 될 때 "폐기 된 개체에 액세스 할 수 없습니다"라는 오류 메시지가 나타납니다.

우리 문장을 using 문에 사용한다는 것은 마지막 중괄호에 도달하면 객체가 처리되지만,이 메서드를 호출 할 때마다 OrganizationService의 인스턴스가 만들어 지므로 객체 이 메서드에 대한 단일 사용자 호출의 범위 내에서 절대로 처리되지 않습니다.

내가 여기에 뭔가 분명한 것을 놓치고 있습니까? 다이나믹스와의 거래를 Microsoft가 어떻게 권장하는지에 대한 내용입니다.

미리 감사드립니다.

종류와 관련, 귀하의 IoC 컨테이너가 싱글IOrganizationService 객체를 제공

답변

0

dotdev. 이것은 모든 요청이 실제로 하나의 동일한 인스턴스를 소비 함을 의미합니다. 그러나 OrganizationService 인스턴스는 동시에 여러 스레드에서 사용할 수 없습니다.

동적 CRM을 백엔드 저장소로 사용하는 웹 서비스의 경우 IOrganizationService 인스턴스 풀을 설계하는 것이 좋습니다. 각 요청은 풀에서 인스턴스를 가져 와서 작업을 수행하고 마지막으로 IOrganizationService 인스턴스를 풀에 반환합니다.이 인스턴스는 다시 사용할 수 있습니다.

+0

안녕하세요. Henk. 귀하의 회신에 감사드립니다. 이것을 완성하기위한 좋은 코드 예제를 알고 있습니까? 싱글 톤을 사용하지 않음으로써 동일한 결과를 얻을 수 있습니까? – dotdev

+0

사용중인 IOC 프레임 워크를 알지 못합니다. 이미 사용 가능한 기능 중 일부가있을 수 있습니다. 요청 당 IOrganizationService 인스턴스를 제공하는 공급자가 싱글 톤 구성을 바꾸는 것으로 시작할 수 있습니다. –

+0

나는 StructureMap을 사용하고 있습니다. "요청 당"문제는 다이나믹 웹 서비스에 대한 호출이 매번 인증을 받아야한다는 것입니다. 또 다른 대안은 컨테이너를 사용하는 것입니다. (). LifecycleIs (new ThreadLocalStorageLifecycle()). (ctx => new OrganizationService (new CrmConnection ("CrmConnection")))); ? 내가 오해하지 않는 한, 각 스레드에 대한 새로운 OrganisationService가 생성 될 것입니다. – dotdev

관련 문제