2016-10-08 2 views
2

Im используя asp.net core. Вот основной способ использования модели с контроллером.Когда нам нужны классы данных?

public class BookController : Controller 
{ 
    private readonly ApplicationDbContext _context { get; set; } 

    public BookController(ApplicationDbContext context) 
    { 
     _context = context; 
    } 

    public IActionResult Create(Book model) 
    { 
     // adding new model 
    } 

    public IActionResult Edit(Book model) 
    { 
     // modifying the model 
    } 

    public IActionResult Delete(Book model) 
    { 
     // removing the model 
    } 
} 

Мой вопрос: когда/должен ли я внедрять код внутри контроллера? Когда/должен ли я реализовать его в другом классе?

Что-то вроде этого:

public interface IBook 
{ 
    int Add(Book book); 

    int Update(Book book); 

    int Remove(Book book); 
} 

public class BookData : IBook 
{ 
    private readonly ApplicationDbContext _context { get; set; } 

    BookData(ApplicationDbContext context) 
    { 
     _context = context 
    } 

    public int Add(Book model) 
    { 
     // ... 

     return _context.SaveChanges(); 
    } 

    // other implements... 
} 

Затем, назвав его внутри контроллера:

public IActionResult Create(Book model) 
{ 
    var bookData = new BookData(_context); 
    int result = bookData.Add(model); 

    // ... 
} 

Для интерфейса, я думаю, что это может быть полезно для случая: У меня есть много контроллеров, которые требуют же имена действий/методов.

Пример: MessageController требует 3 действий/методов, по крайней мере (Create/Add, Edit/Update, Delete/Remove). Это же для NotificationController класса, CommentController класса ...

Таким образом, интерфейс может быть улучшена до:

public interface IMyService<T> where T : class 
{ 
    int Add(T model); 

    int Update(T model); 

    int Remove(T model); 
} 

public class MyService<T> : IMyService<T> where T : class 
{ 
    private readonly ApplicationDbContext _context { get; set; } 

    public MyService(ApplicationDbContext context) 
    { 
     _context = context; 
    } 

    public int Add(T model) 
    { 
     Type type = typeof(model); 

     if (type == typeof(Book)) 
     { 
      // adding new book model 
     } 
     else if (type == typeof(Comment)) 
     { 
      // adding new comment model 
     } 

     // ... 

     return -1; 
    } 

    // other implements... 
} 

ли я что-то неправильно?

ответ

2

Если я правильно прочитал классы данных, вы на самом деле означаете репозиторий (который является абстракцией над уровнем сохранения). Вы должны всегда инкапсулировать логику сохранения за классом (будь то через шаблон репозитория, шаблон команды/запроса или обработчик запроса) и использовать его вместо прямого использования контекста в ваших классах обслуживания.

Это, как говорится, вы можете прямо вводить свой BookData на ваш контроллер вместо ApplicationDbContext. Одна вещь, которую вы должны учесть в своей текущей реализации, - это шаблон «Единица работы». Прямо сейчас каждое добавление моментально сохраняет данные.

Возможно, это не так, как вы хотите, поэтому вы должны переместить _context.SaveChanges(); вне методов Add/Remove/Update и называть его явно. Это позволяет вставлять, т. Е. 10 записей, и если один из них не работает, в базе данных ничего не будет сохранено.

Но если вы вызываете _context.SaveChanges(); после каждой вставки, и вы получаете ошибку в 8-й (из 10) записей, то 7 сохраняются и 3 будут отсутствовать, и вы получите непоследовательные данные.

Контроллер не должен содержать никакой логики вообще, выполнять только короткую проверку входной модели (ModelState.IsValid), и если все в порядке, вызовите службы, которые выполняют всю логику и сообщают результат обратно пользователю. Только в очень простых руководствах и руководствах логика вводится в действие контроллера по причинам простоты. В реальных приложениях вы никогда не должны этого делать. Контроллерам гораздо сложнее выполнить тестирование, чем классы обслуживания.

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