返回&Quot;的MS Dynamics SDK无法访问已处置的对象&Quot; [英] MS Dynamics SDK returning "Cannot access a disposed object"

查看:40
本文介绍了返回&Quot;的MS Dynamics SDK无法访问已处置的对象&Quot;的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我们的.NET项目中,我们使用Dynamics SDK(版本8.2.0.2)从我们的网站访问Dynamics 365。我们使用CrmSvcUtil工具生成要使用的早期绑定类。

在我们的依赖项解析器中,每当请求IOrganizationService时,我们都会注入到Dynamics的连接,如下所示:

container.For<IOrganizationService>()
            .Singleton()
            .Use(ctx => new OrganizationService(new CrmConnection("CrmConnection")));

在我们处理与Dynamics通信的类中,我们的构造函数被创建为将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()方法时,我们会收到错误消息"Cannot Access a Disposed Object"。

我意识到将我们的代码包装在Using语句中意味着当到达最后一个大括号时将释放对象,但我也假设每次调用此方法都会创建其自己的OrganizationService实例,因此该对象永远不会被释放在单个用户调用此方法的范围内。

我是不是遗漏了什么明显的东西?毕竟,这是微软建议针对Dynamics执行事务的方式。

提前感谢您抽出时间。

向您致以亲切的问候

dotdev

推荐答案

您的IoC容器提供了一个IOrganizationService对象作为单例。这意味着每个请求实际上使用一个相同的实例。但是,一个OrganizationService实例不能同时由多个线程使用。

对于使用Dynamics CRM作为后端存储的Web服务,一个好的选择可能是设计一个IOrganizationService实例池。每个请求从池中获取一个实例,执行其任务,最后将IOrganizationService实例返回到池,在那里它将可供重用。

这篇关于返回&Quot;的MS Dynamics SDK无法访问已处置的对象&Quot;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆