指定Web服务引用自动生成的实体基类

题:
是否有可能(自动)更改通过Visual Studio的“添加Web引用”功能创建自动生成的域对象的基类,无需手动修改References.cs?

背景:
当我们添加一个引用到Web服务(通过Visual Studio的“添加Web引用”功能),一些类是自动生成的。 论文表示代理对象(例如一个MyServiceSoapClient)和一些自动生成的域对象的(比方说,例如CustomerInfo)。

所以,如果我做一些事情大致如下的几行:

MyServiceSoapClient client = new MyServiceSoapClient(); CustomerInfo cust = client.GetCustomer("John Smith");

我会得到一个CustomerInfo对象的各种属性等,都很好地无论从任何XML服务器返回反序列化。

问题是...
可以说,我改变了卡斯特对象为“鲍勃·迪伦”的名称属性的值。
理想情况下,我想有一个基类叫做ServiceEntity将跟踪如果已经作了修改(通过捕获continently提供INotifyPropertyChanged.PropertyChanged事件的基类),提供一个“脏”属性,指示对象具有更改,因为它是从服务中获取。

解决方案
虽然下面的答案是好的,我们采取了稍微不同的方法...
作为同步状态只需要记录在少数情况下,更有意义通过通用类添加同步跟踪,以便在需要时,我们可以使用它。
这里有一个例子通用类和接口:

接口:

public interface ISyncEntity { /// <summary> /// Gets or Sets the Entity Sync State /// </summary> [XmlIgnore] [SoapIgnore] EntitySyncState SyncState { get; set; } /// <summary> /// Flag for deletion /// </summary> void DeleteOnSync(); /// <summary> /// Flag for Creation /// </summary> void CreateOnSync(); }

类:

public class SyncEntity<TEntity> : ISyncEntity { /// <summary> /// Backing Field for Entity Property /// </summary> private TEntity _entity; /// <summary> /// Gets or Sets the Entity in question /// </summary> public TEntity Entity { get { return _entity; } set { OnEntityChange(value); } } /// <summary> /// Invoked when a Property on the Entity is changing /// </summary> /// <param name="entity"></param> protected void OnEntityChange(TEntity entity) { // Detach the property change event handler from the previous entity? if (_entity is INotifyPropertyChanged) (entity as INotifyPropertyChanged).PropertyChanged -= OnPropertyChange; // Set backing field _entity = entity; // Implements INotifyPropertyChanged? if (entity is INotifyPropertyChanged) (entity as INotifyPropertyChanged).PropertyChanged += OnPropertyChange; // Set the Sync State SyncState = EntitySyncState.Unchanged; } /// <summary> /// Fired when a property in the entity changes /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void OnPropertyChange(object sender, PropertyChangedEventArgs e) { // If a delete or create is already pending, don't worry about the update! if (SyncState == EntitySyncState.Unchanged) SyncState = EntitySyncState.UpdatePending; } #region Sync Framework Members [XmlIgnore] [SoapIgnore] public EntitySyncState SyncState { get; set; } public void DeleteOnSync() { SyncState = EntitySyncState.DeletePending; } public void CreateOnSync() { SyncState = EntitySyncState.CreatePending; } #endregion }

扩展方法:

public static SyncEntity<TEntity> ToSyncEntity<TEntity>(this TEntity source) { if (source == null) throw new ArgumentException("Source cannot be null"); return new SyncEntity<TEntity>() { Entity = source }; }

--------------解决方案-------------

通过Visual Studio的Web引用生成的客户端代理类的特点是内置了与.NET框架的Wsdl.exe用工具。 当生成的输出产生的公共部分类。 而是试图修改自动生成的输出,你可以在增加你想实现事件代码的另一个文件提供额外的类代码。

当然,这与叶实施类似代码对每个对象。 根据您的源服务,你可以考虑延长SoapHttpClientProtocol(或任何协议的基类代表你的对象)提供一个实现你所有的继承对象。 这未必是可能的,而不使用AOP。 因此,您的里程可能会有所不同。

分类:C# 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.639 (s). 10 q(s)