2015-06-20 2 views
1

[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? Спасибо заранее!

ответ

Смежные вопросы