[EDIT] Перед чтением мне удалось решить это, просто набрав разные классы данных. Я обновил код с помощью того, что работает, но вы все приветствуетесь с советами!Отображение DTO с использованием интерфейса
Уважаемые StackOverflow пользователей,
Я хотел бы начать с того, что я понимаю, что этот вопрос, скорее всего, будет Relatable к Automapper. К сожалению ... NuGet по какой-то причине не хочет устанавливать Automapper. Итак, вместо этого я решил попробовать свой выстрел в написании ручного картографа между DTO и сущностями. Я новичок в IoC и DI, которые, как я предполагаю, является основной причиной того, почему моя реализация неверна.
В основном у меня есть 5+ разных датаагрейдов, где все они связаны с разными таблицами и поэтому имеют разные структуры. Однако все они имеют одни и те же обработчики сообщений, которые указывают на те же методы в viewmodel, которые будут заботиться о добавлении, удалении и изменении.
Код, обрабатывающий удаление, выглядит следующим образом.
В ViewModel:
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);
}
И код, который обрабатывает добавление и модифицирование выглядит следующим образом:
В ViewModel:
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; }
Как бы решить эту проблему, чтобы сохранить код чистым и общие методы/картографа, что будет работать с любым datagrid? Спасибо заранее!