Извините, если этот вопрос будет слишком широким, но если это вопрос о нормальном приложении на основе ASP.NET MVC 5 Owin с подключением по умолчанию к серверу MSSQL, у меня не было бы таких трудностей, но мы используем CRM в качестве нашей базы данных.
Хорошо, поскольку я уже упоминал, что работаю над приложением ASP.NET MVC5, и мне трудно найти, что лучше всего создать, оставить открытым и закрыть соединение с Dynamics CRM 365?
Я нашел много сообщений и блогов, но каждый тянет на свою сторону дороги.
Некоторые говорят, что для каждого запроса лучше открывать новое соединение в using
заявлении, чтобы его можно было сразу закрыть (звучит хорошо, но это возможно, что запросы будут медленными, потому что при каждом запросе необходимо открывать новое соединение с CRM).
Некоторые говорят, что «лучше сделать singleton
объект в области приложения, держать его открытым в течение всего срока службы приложения и повторно использовать его при каждом запросе».
Обычно я бы использовал OrganizationServiceProxy
в каком-нибудь простом консольном приложении, но в этом случае я не уверен, следует ли мне использовать OrganizationServiceProxy
или CrmServiceClient
или что-то еще?
Если бы у кого-то была или была подобная проблема, любой намек был бы отличным.
ОБНОВЛЕНИЕ:
@Nicknow
Я загрузил SDK с SDK 365 и использую этот dll-s. Microsoft.Xrm.Sdk.dll
, Microsoft.Crm.Sdk.Proxy.dll
, Microsoft.Xrm.Tooling.Connector.dll
и Microsoft.IdentityModel.Clients.ActiveDirectory.dll
.
Вы упоминаете
Microsoft.CrmSdk.XrmTooling.CoreAssembly 8.2.0.5.
Если правильно, этот пакет nuget использует официальную сборку, которую я загрузил, или в этот пакет внесены некоторые изменения?
Об этом тесте
контрольный тест
Если я правильно понял, независимо от того, использую ли я оператор using
, реализую метод Dispose()
или просто использую статический класс в области действия приложения в течение всего времени существования приложения, я всегда получу один и тот же экземпляр (если я использую настройки по умолчанию RequireNewInstance=false
)?
Для простоты кода я обычно создаю статический класс (можно также использовать синглтон, но обычно это будет излишним), чтобы вернуть объект CrmServiceClient. Таким образом, мой код не засоряется новыми вызовами CrmServiceClient, если я захочу что-либо изменить в том, как выполняется соединение.
Итак, было бы хорошей практикой создать статический класс в области приложения, который живет в течение всего срока службы приложения? Это означает, что каждый пользователь, который делает запрос, будет использовать один и тот же экземпляр? Разве это не проблема производительности для одного этого соединения?
Все вызовы ваших методов будут выполняться до завершения или вызывать исключение, поэтому, даже если сборщик мусора занимает некоторое время, нет открытого соединения, которое потребляет ресурсы и / или блокирует другие действия.
Это возвращает меня к разделу, где я всегда получаю один и тот же экземпляр CrmServiceClient
и часть, в которой xrm.tooling обрабатывает кешированное соединение с другой стороны, но что происходит на этой стороне (веб-приложение). Разве подключение к CRM (т.е. CrmServiceClient
) неуправляемым ресурсам, не следует ли Dispose()
это явно?
Я нашел несколько примеров с CrmServiceClient
, и почти во всех примерах CrmServiceClient
приведено в IOrganizationService
с использованием CrmServiceClient.OrganizationWebProxyClient
или CrmServiceClient.OrganizationServiceProxy
.
Почему это так и каковы преимущества этого?
У меня так много вопросов, но это уже можно задать. Есть ли какая-нибудь онлайн-документация, на которую вы могли бы указать мне?