Я знаю, что это старый вопрос, но мне хотелось бы найти эту информацию, когда я начинал.
В нашем случае, когда у нас есть клиент Win32 Delphi в нашем многоуровневом решении, я использовал шаблоны (в C #) для генерации классов DTO в .Net и их коллег из win32.
Это позволяет нам инкапсулировать функциональность CRUD на клиенте, используя в основном автоматически сгенерированный код Delphi:
procedure Delete;
class function DeleteDto(const _dESPATCHID: integer) : boolean;
class function GetNextID : integer;
class function Get(const _dESPATCHID: integer) : TDtoDESPATCH; overload;
class function Collection(const __filterXml: string): TList<TDtoDESPATCH>;
function Load: boolean; overload;
function Populate(_primaryDict : TDictionary<string, Variant>) : boolean;
function Save : boolean; overload;
Отслеживание изменений с клиента также может быть автоматизировано, поэтому каждый установщик свойств помечает измененное свойство, чтобы гарантировать, что обновляются только измененные свойства.
Например:
procedure TDtoDESPATCH.SetSCT_STATUS(const value : string);
begin
if (self.IsLoaded) and (inherited SCT_STATUS <> value) then
begin
TrackChange('SCT_STATUS');
self.Modified:= True;
end;
inherited SCT_STATUS := value;
end;
На стороне сервера другой шаблон заботится обо всех операциях CRUD в автоматически сгенерированной службе WCF, которая также отображается как веб-служба asmx. Интерфейс, методы WCF и все аннотации генерируются из шаблона.
// convert to entity
var _entity = _dto.ToEntity();
if(exists)
{
Global.LogActivity(string.Format("{0} - profile {1}, updating DESPATCH: {2}", racID, profile, _dto.ChangedProperties ));
// Attach the entity to the db
db.DESPATCHes.Attach(_entity);
// Change tracking
ChangeTracking<DESPATCH>(_dto.ModifiedProperties, db, _entity);
}
В сценарии, где WIN32 должен быть частью решения, ручное кодирование всего этого было бы (хуже) кошмаром.