c# - 编写 CRM 2011 插件的最佳设计模式

标签 c# dynamics-crm-2011

由于客户提供的复杂请求,有时我的代码会变得困惑。 我花时间阅读和理解我上次写的东西,但这需要时间。

我想知道是否有人实现了一种好的设计模式,可以节省时间并使代码更有条理和可读性等。

最佳答案

拥有一个实现 IPlugin 的基础插件是朝着正确方向迈出的良好一步。它的 Execute 函数可以将 IServiceProvider 以及您的 dataContext 或 OrganizationService 传递到一个抽象的 onExecute 方法中,该方法被包装在一个带有虚拟错误处理程序方法的 try catch 中。这将消除大量重复的样板代码...

编辑 1

添加了显示抽象 OnExecute 和虚拟错误处理程序的代码示例:

public abstract class PluginBase : IPlugin
{

    public void Execute(IServiceProvider serviceProvider)
    {
        try
        {
            OnExecute(serviceProvider);
        }
        catch (Exception ex)
        {
            bool rethrow = false;
            try
            {
                OnError(ex);
            }
            catch
            {
                rethrow = true;
            }

            if (rethrow)
            {
                throw;
            }
        }
        finally
        {
            OnCleanup();
        }
    }

    // method is marked as abstract, all inheriting class must implement it
    protected abstract void OnExecute(IServiceProvider serviceProvider);

    // method is virtual so if an inheriting class wishes to do something different, they can
    protected virtual void OnError(Exception ex){
        // Perform logging how ever you log:
        Logger.Write(ex);
    }

    /// <summary>
    /// Cleanup resources.
    /// </summary>
    protected virtual void OnCleanup()
    {
        // Allows inheriting class to perform any cleaup after the plugin has executed and any exceptions have been handled
    }
}

编辑2

我在 DLaB.Xrm.Plugin 命名空间中的 DLaB.Xrm(在 Nuget 上)中定义了一个插件基础,它可以为您处理很多很棒的事情。 Here是一个示例插件类,向您展示如何使用它。

关于c# - 编写 CRM 2011 插件的最佳设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11097356/

相关文章:

c# - NHibernate 中 Session.Merge 方法的用法是什么?

c# - 有没有办法组合 List.Contains() 和 string.StartsWith()?

javascript - 如何获取调用 Javascript 函数的控件?

C# 自定义属性编辑器

c# - 合并(合并?)并简化/减少 GeoJson 的 DbGeometry 记录

c# - 合并2个数组,保持有序,求效率

c# - CRM 2011 创建产品插件

javascript - CRM 2011 - JavaScript - 在哪里设置业务要求

.net - 在 Microsoft CRM 4.0 中使用 Web 服务与使用动态实体

dynamics-crm-2011 - 使用 context.InputParameters ["Target"]