在WCF服务中修剪反序列化上的空格

在WCF服务中修剪反序列化上的空格,wcf,deserialization,pipeline,Wcf,Deserialization,Pipeline,我的要求是采用一种通用方法来确保数据库中不存储前导/尾随空格。我们的建筑是 WCF->Business Logic Manager->Generic Repository->Entity Framework 5.0->DB 现在我有两种方法 在通用存储库中执行此操作(但在这里,我必须在整个对象图中搜索字符串属性并更改值) 在WCF管道中进行反序列化时执行此操作(但在这里,我可能必须放置自定义序列化程序,我不想在序列化过程中只执行一个事件,在该事件中我可以查询属性类型并更改其值) 我赞成方法2,但

我的要求是采用一种通用方法来确保数据库中不存储前导/尾随空格。我们的建筑是 WCF->Business Logic Manager->Generic Repository->Entity Framework 5.0->DB

现在我有两种方法

  • 在通用存储库中执行此操作(但在这里,我必须在整个对象图中搜索字符串属性并更改值)
  • 在WCF管道中进行反序列化时执行此操作(但在这里,我可能必须放置自定义序列化程序,我不想在序列化过程中只执行一个事件,在该事件中我可以查询属性类型并更改其值)
  • 我赞成方法2,但希望在不改变整个序列化程序的情况下找到最简单的方法。是否有一种方法可以在不使用自定义序列化程序的情况下对其进行更改。我们目前正在使用XmlSerializer

    寻找以下输入(2)

  • 哪种方法的性能更好
  • 如何在WCF管道中的现有序列化过程中附加我的小方法
  • 谢谢,
    Avi

    您的代码应该在数据层而不是序列化层上工作,因为这是需求产生的地方

    至于实现,您有两种选择

    您可以使用
    DbChangeTracker
    或使用
    idbcomandinterceptor
    (在EF6中新增)来更改EF上下文的行为

    下面是如何使用change tracker轻松完成此操作

    public class FooContext : DbContext
    {
        public override int SaveChanges()
        {
            var items = ChangeTracker.Entries().Where(e => e.State == EntityState.Added).ToList();
            foreach(var item in items)
            foreach(var property in item.PropertyNames)
            {
                var propValue = item[property] as string;
                if(propValue != null)
                {
                    item[property] = propValue.Trim();
                }
            }
            return base.SaveChanges();
        }
    }
    

    “我的要求是采用一种通用方法,确保数据库中不存储前导/尾随空格”,您的要求是什么级别?这是传输要求吗?这是持久性要求,消息已经到达最后一层,现在需要持久化。我想在XML被反序列化时解决这个问题,这样我就不必再次使用反射来查询类型及其值。我知道我问题的答案。我的观点是“最小惊喜原则”。至于你对反思的关注。您的ORM已经拥有实体类型的元数据(它知道所有属性,以及哪些属性是字符串)。实现需求的代码与它所来自的实际层的距离越远……您的“惊喜”就越多,而且更可能是一些中间代码为您捏造了它。我想您是对的,如果任何开发人员不小心更改了任何下游层中的数据,事情可能会走下坡路。经过再三考虑,我意识到ParameterInputers可以用于这样的任务,但我不得不再次回到反射上来,因为我将为字符串类型挖掘整个对象图。存储库是执行此类操作的最佳场所。谢谢,我很高兴回答:)。