开始之前,我们要确认一下 Plugin 的 pipeline. PreValidation -> PreOperation -> Server Side System Main Event-> PostOperation
PreValidation 是在security check 之前, 通常会用来加载外部数据和用户不相关的内容.
PreOperation 是在security check 之后 服务器处理之前, 通常会用来做一系列的功能.PostOperation 是在System Main Event 在服务器处理发生之后, 通常是用来对Event做一些额外添加.
Database Transaction Support
DTS 值在PreOperation 和PostOperation中有效.
DTS是 当你有exception的时候, 你的所有的data 都会roll back 不会记录到数据库中. 只有完全execute的Plugin的数据才会储存
我们开始做我们第三个plugin. PreValidation
这个Plugin的功能是查重. 是的,虽然系统内置有查重功能,但是为了做PreValidation的plugin,我们实现一下.
这里我们用QueryExpression用来查询email address
// Plug-in business logic goes here. string email = string.Empty; if (contact.Attributes.Contains("emailaddress1")) { email = contact.Attributes["emailaddress1"].ToString(); // Now we need use query to retrieve email // select * from contact where emailaddress1 == 'email' var query = new QueryExpression("contact"); query.ColumnSet = new ColumnSet(new string[] { "emailaddress1" }); query.Criteria.AddCondition("emailaddress1", ConditionOperator.Equal, email); var collection = service.RetrieveMultiple(query); if (collection.Entities.Count > 0) { throw new InvalidPluginExecutionException("Contact with email already exists!!!"); } }
我们把代码复制到try里面之后rebuild. 用PluginRegistration tool把代码重新部署到instance当中.
之后我们创建一个contact填写好邮箱,用contact2来填写相同邮箱.
这时候就会出现我们的bug
让我们打开Error Log 发现我们的message是之前代码中编译好的.