Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 CRM 2011插件-使用属性名的早期绑定实体是否会导致内存问题?_C# 4.0_Memory Management_Dynamics Crm 2011 - Fatal编程技术网

C# 4.0 CRM 2011插件-使用属性名的早期绑定实体是否会导致内存问题?

C# 4.0 CRM 2011插件-使用属性名的早期绑定实体是否会导致内存问题?,c#-4.0,memory-management,dynamics-crm-2011,C# 4.0,Memory Management,Dynamics Crm 2011,在我的插件代码中,我使用早期绑定的实体(通过生成)。在我的代码中,我使用MemberExpression来检索属性的名称。例如,如果我想要启动插件的用户的全名,我会执行以下操作 SystemUser pluginExecutedBy = new SystemUser(); pluginExecutedBy = Common.RetrieveEntity(service , SystemUser.EntityLogic

在我的插件代码中,我使用早期绑定的实体(通过生成)。在我的代码中,我使用MemberExpression来检索属性的名称。例如,如果我想要启动插件的用户的全名,我会执行以下操作

SystemUser pluginExecutedBy = new SystemUser();
pluginExecutedBy = Common.RetrieveEntity(service
                                        , SystemUser.EntityLogicalName
                                        , new ColumnSet(new string[] {Common.GetPropertyName(() => pluginExecutedBy.FullName)})
                                        , localContext.PluginExecutionContext.InitiatingUserId).ToEntity<SystemUser>();
我的解决方案架构师的评论:

与其像上面那样编写代码,不如像这样编写(硬编码字段的名称,或者使用结构)


还是花在分析上的问题/时间不值得?

早绑定、晚绑定、MemberExpression、bla bla bla:)

我能理解“哲学”,但看着你的代码,我脑海中会弹出一个巨大的警报:

公共静态实体检索实体(IOOrganizationService xrmService、字符串entityName、列集列、Guid entityId)
{
return(Entity)xrmService.Retrieve(entityName、entityId、columns);
}
如果未找到记录,
检索
将引发异常

关于其他方面,GetPropertyName是可以的,但是总是可以选择的,例如,我尝试在插件中使用always late bound,可能在我更喜欢使用early bound的项目中,通常有不止一种方法来解决问题


快乐的crm编码

虽然
GetPropertyName
是一个相当聪明的解决方案,但我不喜欢它,这完全是为了可读性。对我来说,它更容易理解所发生的事情:
newcolumnset(newstring[]{“fullname”})

但这几乎是个人偏好,但重要的是要记住,您不仅为自己编写代码,而且为团队编写代码,他们应该能够轻松理解您所完成的工作

作为一个方面,硬编码字符串可能在运行时表现更好。我通常硬编码我的所有值,如果CRM中的实体模型发生更改,我将不得不重新访问以在任何情况下进行更改。在那种情况下,早起和晚起没有区别

我不明白这个函数的意义

public static Entity RetrieveEntity(IOrganizationService xrmService, string entityName, ColumnSet columns, Guid entityId)
{
    return (Entity)xrmService.Retrieve(entityName, entityId, columns);
}
它不做任何事情(除了铸造已经是那种类型的东西)

1.您的代码在需要对象之前不必要地创建了对象(因为您在 RetrieveEntity,以便与我的GetProperty方法一起使用),这是 糟糕的编程实践。在我的代码中,我从未使用过新的 关键字,但仅对其进行强制转换,而强制转换不会创建新的 反对

我相信这是指,
SystemUser pluginExecutedBy=newsystemuser()我可以理解他/她的观点,在本例中,
new SystemUser()
做的不多,但是如果您实例化的对象做了一些资源密集型的事情(加载文件、打开数据库连接),您可能会做一些“浪费”的事情。在这种情况下,如果更改
SystemUser pluginExecutedBy=null,我会感到惊讶实际上产生了任何显著的性能增益

2.如果Common.Retrieve返回null,则代码具有不必要的内存分配,这将导致性能问题

如果这导致了性能问题,我会感到惊讶,而且正如Guido指出的那样,函数在任何情况下都不会返回null

总的来说,我强烈感觉这段代码没有什么需要改变的地方——但事情总是可以变得更好,并且值得讨论(例如,代码审查的要点),尽管很难不让你知道你不应该对代码感到珍贵

就我个人而言,我会使用硬编码的属性名称并转储Common.RetrieveEntity函数,因为它什么都不做

pluginExecutedBy = service.Retrieve(SystemUser.EntityLogicalName, localContext.PluginExecutionContext.InitiatingUserId, new ColumnSet(new String[] {"fullname"} ));

问一个问题,努力在你所做的事情上做得更好,从来都是不值得的。此外,批评您的解决方案可能有点低效,但不是错误的,因为您在批准使用静态类和方法的同时,对属性名称进行了一些创造性的思考。这不会让我对这个“架构师”评价过高。@GCATNM-您和您的双重否定!;-)我花了整整30秒才读到“永远不值得”—眼睛读到了,大脑把它解释为“永远不值得…”,我有点倾向于点击删除。现在离午夜还有30分钟,该去休息了!哈,我知道……但那个普通的。检索实体函数也是他写的。所以,没有注释:-)另外,我想发布一个包含代码片段的完整场景。而且,“霸主”已经决定使用早期绑定(同样没有争论)。所以,我必须使用早期绑定,和常见的功能-我可以添加,但不能编辑其中任何一个!我明白,但过度思考会导致注意力不集中。您使用的是早期绑定,明天更改字段名,您需要重建您的crmsvutil类并重新编译插件,以便让GetPropertyName或硬编码字段名在插件中产生如此大的差异?插件是否如此复杂且可重复使用,以至于需要在其上构建城堡?:)就异常而言,我并不认为有什么问题,几乎所有函数在使用不当时都会抛出异常。由于该用户希望获得存在的记录的ID,因此您不太可能使用不存在的ID—您从哪里获得它?如果它确实抛出异常,您可能希望它冒泡,这取决于异常处理设计。@JamesWood这很少见,但可能发生(我认为可以模拟使用同步插件在异步插件检索记录之前删除记录),但这不是重点,正如您所说,这也是一种设计选择。我想表达的是OP和他的软件架构师之间的“无用的宿怨”(在我看来),考虑到所描述的上下文(插件中的早期绑定与后期绑定),我同意。我重新编写了整个公共方法库,在我的代码中包括了它,因为他特别声明我不能修改/删除任何东西。我补充说
SystemUser pluginExecutedBy = null;
pluginExecutedBy = Common.RetrieveEntity(service
                                        , SystemUser.EntityLogicalName
                                        , new ColumnSet(new string[] {"fullname"})
                                        , localContext.PluginExecutionContext.InitiatingUserId).ToEntity<SystemUser>();
public class ClientName
{
    public struct EntityNameA
    {
        public const string LogicalName = "new_EntityNameA";
        public struct Attributes
        {
            public const string Name = "new_name";
            public const string Status = "new_status";
        }
    }
}
public static Entity RetrieveEntity(IOrganizationService xrmService, string entityName, ColumnSet columns, Guid entityId)
{
    return (Entity)xrmService.Retrieve(entityName, entityId, columns);
}
pluginExecutedBy = service.Retrieve(SystemUser.EntityLogicalName, localContext.PluginExecutionContext.InitiatingUserId, new ColumnSet(new String[] {"fullname"} ));