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