问题描述
在我们的.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;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!