CrmPluginBase2015 2.0.0
dotnet add package CrmPluginBase2015 --version 2.0.0
NuGet\Install-Package CrmPluginBase2015 -Version 2.0.0
<PackageReference Include="CrmPluginBase2015" Version="2.0.0" />
paket add CrmPluginBase2015 --version 2.0.0
#r "nuget: CrmPluginBase2015, 2.0.0"
// Install CrmPluginBase2015 as a Cake Addin #addin nuget:?package=CrmPluginBase2015&version=2.0.0 // Install CrmPluginBase2015 as a Cake Tool #tool nuget:?package=CrmPluginBase2015&version=2.0.0
CrmPluginBase
Basic functionality for MS Dynamics CRM 2015 plugins - see example.
Provides ability for easy CRM plugins creation with focus on what you need to do and out of pain InputParameters/OutputParameters parsing.
Install package from nuget and enjoy!
IMPORTANT NOTE:
from now you must NO name your PreEntityImage as preimage
and PostEntityImage as postimage
- now you can override PreEntityImageName and PostEntityImageName properties and name 'em on your own
using System;
using System.Runtime.CompilerServices;
using Microsoft.Crm.Sdk.Messages;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using CrmPluginBase.Exceptions;
using ProxyClasses;
namespace CrmPluginBase.Examples
{
// ReSharper disable once RedundantExtendsListEntry
// ReSharper disable once ClassNeverInstantiated.Global
/// <summary>
/// A simple example of CrmPluginBase usage with proxy class entity new_search.
/// Certainly you can use any of your own proxy classes or even just Entity as generic type parameter (<see cref="TraceAllUpdateOperationsPlugin"/>)
/// </summary>
public class DenyActiveRecordDeletionPlugin : CrmPlugin<new_search>, IPlugin
{
/// <summary>
/// Deny deletion of active new_search entities
/// </summary>
/// <exception cref="CrmException">Deletion of active new_search records is forbidden!</exception>
public override void OnDelete(IPluginExecutionContext context, string entityName, Guid primaryEntityId, new_search preEntityImage)
{
if (preEntityImage.statuscode == new_searchStatus.Active_Active)
{
throw new CrmException($"Deletion of active {new_search.EntityLogicalName} records is forbidden!", expected: true);
}
}
protected sealed override string PreEntityImageName => "MyCustomPreEntityImage";
}
// ReSharper disable once RedundantExtendsListEntry
// ReSharper disable once ClassNeverInstantiated.Global
/// <summary>
/// A simple example of CrmPluginBase usage with Entity as generic type parameter
/// </summary>
public class TraceAllUpdateOperationsPlugin : CrmPlugin<Entity>, IPlugin
{
public override void OnUpdate(IPluginExecutionContext context, Entity entity, Guid primaryEntityId)
{
var message = $"Entity '{entity.LogicalName}', Id = '{primaryEntityId}' updated";
var traceEntity =
new Entity("new_trace")
{
["new_tracemessage"] = message
};
SystemOrgService.Create(traceEntity);
TracingService.Trace(message);
}
}
public class RestrictAccountsExportToExcelPlugin : CrmPlugin<Account>, IPlugin
{
public override void OnExportToExcel(IPluginExecutionContext context, QueryBase query, EntityCollection entityCollection)
{
if (!UserAvailableForExportAccountsToExcel(context.UserId))
{
throw new CrmException("You can't export accounts to Excel", expected: true);
}
var queryExpression = ToQueryExpression(query);
if (queryExpression == null)
{
return;
}
// note: Add your own conditions here
queryExpression.Criteria.AddCondition("donotpostalmail", ConditionOperator.Equal, false);
// ReSharper disable once RedundantAssignment
query = queryExpression;
}
/// <summary>
/// Just to show a possibility of custom exception handling in pipeline
/// </summary>
protected override void OnException(Exception ex)
{
// ToDo: paste your custom exception handling logic here (log exception for example)
base.OnException(ex);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private QueryExpression ToQueryExpression(QueryBase query)
{
switch (query)
{
case QueryExpression queryExpression:
return queryExpression;
case FetchExpression fetchExpression:
{
var request =
new FetchXmlToQueryExpressionRequest
{
FetchXml = fetchExpression.Query
};
return ((FetchXmlToQueryExpressionResponse)SystemOrgService.Execute(request)).Query;
}
default:
return null;
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private bool UserAvailableForExportAccountsToExcel(Guid userId)
{
// note: Paste your custom check logic here
return false;
}
}
}
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET Framework | net452 is compatible. net46 was computed. net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
-
.NETFramework 4.5.2
- Dynamics.Crm.Sdk.Clean (>= 7.1.2.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated | |
---|---|---|---|
2.0.0 | 940 | 8/12/2019 | |
1.0.0.11 | 1,139 | 7/30/2017 | |
1.0.0.10 | 1,032 | 7/30/2017 | |
1.0.0.9 | 1,085 | 7/8/2017 | |
1.0.0.8 | 1,034 | 7/8/2017 | |
1.0.0.7 | 1,086 | 7/8/2017 | |
1.0.0.6 | 1,142 | 11/11/2016 | |
1.0.0.5 | 1,111 | 11/11/2016 | |
1.0.0.4 | 1,079 | 11/11/2016 | |
1.0.0.3 | 1,219 | 10/19/2016 | |
1.0.0.2 | 1,070 | 10/13/2016 | |
1.0.0.1 | 1,288 | 7/13/2016 | |
1.0.0 | 1,257 | 7/13/2016 |
1. boost a little work with dictionaries
2. overridable exception handling strategy - now you can override OnException method and do your custom logic with exception