2015-06-20 37 views
1

[編輯]在閱讀之前,我已經設法通過簡單地轉換不同的數據類來解決這個問題。 我已經更新了有用的代碼,但您都可以使用提示!使用接口的DTO映射

尊敬的用戶計算器,

我想說,我明白,這個問題是最有可能將是聽上去很像至Automapper出發了。 不幸的是,NuGet出於某種原因不願意安裝Automapper。 因此,我決定嘗試在DTO和實體之間編寫手動映射器。 我對IoC和DI有點新,我猜測這是我的實現不正確的主要原因。

基本上我有5 +個不同的datagrids,其中所有這些datagrids鏈接到不同的表,因此有不同的結構。但是,它們都具有完全相同的消息處理程序,它們指向視圖模型中的相同方法,以處理添加,刪除和修改操作。

處理刪除的代碼如下所示。

在視圖模型:

public void KeyDown(EventArgs eventArgs, object sourceSender) 
    { 
     var dataGridContext = sourceSender as DataGrid; 
     var keyEventArgs = eventArgs as KeyEventArgs; 
     if (keyEventArgs == null) return; 
     switch (keyEventArgs.Key) 
     { 
      case Key.Delete: 
       if (dataGridContext != null) 
         foreach (var selectedEntity in dataGridContext.SelectedItems.OfType<IEntityObject>()) 
         { 
          _mainModel.DeletePendingEntityObject(selectedEntity); 
         } 
       break; 
     } 
    } 

在模型:

public void DeletePendingEntityObject<TEntity>(TEntity sender) where TEntity : IEntityObject 
    { 
     if (sender.State == EntityState.Added) 
     { 
      _pendingEntityObjects.Remove(sender); 
      return; 
     } 
     AddPendingEntityObject(sender, EntityState.Deleted); 
    } 

並處理該代碼添加和修改如下:

在視圖模型:

public void RowEditEnding(object sender) 
    { 
     var dataGridContext = sender as DataGrid; 
     if (_isNewItem && dataGridContext != null) 
     { 
      var item = dataGridContext.CurrentItem as IEntityObject; 
      _mainModel.AddPendingEntityObject(item, EntityState.Added); 
      _isNewItem = false; 
     } 

     else if (dataGridContext != null) 
     { 
      var item = dataGridContext.CurrentItem as IEntityObject; 
      if (item == null) return; 
      _mainModel.AddPendingEntityObject(item, EntityState.Modified); 
     } 
    } 

在該模型中:

public void AddPendingEntityObject<TEntity>(TEntity sender, 
EntityState entityState) where TEntity : IEntityObject 
    { 
     sender.State = entityState; 
     _pendingEntityObjects.Add(sender); 
    } 

現在,這一切完美的作品,直到我想創建一個映射,將映射DTO對象的實體將其保存到數據庫中。 我相信實現是不正確的,因爲我將不得不添加接口中的每個屬性,我想在DtoMapper.cs中進行映射(如下所示)。最終所有DTO的變量與它們無關。

這是我嘗試它:

foreach (var item in _pendingEntityObjects) 
      { 
       using (var context = new CentralEntities()) 
       { 
        var entityObj = new DtoMapper<IEntityObject>(item); 
        context.Entry(entityObj.TranslatedObj).State = item.State; 
        context.SaveChanges(); 
       } 
      } 

這是DtoMapper.cs的樣子:

public DtoMapper(T t) 
    { 
     if (t.GetType() == typeof(Table1Dto)) 
     { 
      var table1Obj = t as Table1Dto; 
      if(table1Obj != null) 
      TranslatedObj = new table_1 
      { 
       id = table2Obj.Id, 
       table1Code = table1Obj.Table1Code, 
       reference = table1Obj.Reference 
      }; 
     } 
     else if (t.GetType() == typeof (Table2Dto)) 
     { 
      var table2Obj = t as Table2Dto; 
      if(table2Obj != null) 
      TranslatedObj = new table_2 
      { 
       id = table2Obj.Id, 
       table2Code = table2Obj.Table2Code, 
       reference = table2Obj.Reference 
      }; 
     } 
    } 

    public object TranslatedObj { get; set; } 

我將如何解決這個問題,以保持代碼的清潔和通用方法/映射器,可以使用任何數據網格? 在此先感謝!

回答