[編輯]在閱讀之前,我已經設法通過簡單地轉換不同的數據類來解決這個問題。 我已經更新了有用的代碼,但您都可以使用提示!使用接口的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; }
我將如何解決這個問題,以保持代碼的清潔和通用方法/映射器,可以使用任何數據網格? 在此先感謝!