2016-11-03 5 views
0

Я работаю над ASP.NET MVC-приложением &, чтобы задать вам быстрый вопрос дизайна. Поэтому мне нужно реализовать общую функциональность для всех моих контроллеров (ну, большинство из них). Я не хочу повторять ту же логику во всех контроллерах. Что было бы идеальным подходом в интересах MVC?Общая функциональность на нескольких контроллерах ASP.NET MVC

Я обнаружил, что люди говорят, что создают базовый контроллер и наследуют его в ваших контроллерах. Но когда я визуализую контроллер, я вижу, что он будет содержать только методы действий, которые возвращают некоторый контент/представления. Исправьте меня, если я ошибаюсь.

OneController 
    { 
     ActionMethod A1 
     { 
      //Code to return list of objects for the given integer value. So it calls database stored procedure. 
     } 
    } 

... несколько таких контроллеров есть.

Я все еще хотел бы, чтобы A1 существовал в OneController, просто поместил его логику где-то в обычное место.

Также некоторые люди предлагают создать простой класс помощника, чтобы разместить общий метод.

Не могли бы вы предложить мне, какой подход будет лучше (или любой другой подход)? Благодарю.

+0

Контроллер может содержать методы и методы действий, если вы хотите, базовый класс контроллера - это хороший вариант, который вам нужен. – DanielVorph

ответ

1

Я согласен с вами в том, что большую часть времени имеет смысл наследовать от базовых контроллеров, когда мы говорим о Actions или о методах, которые действительно связаны. Но, конечно, вы можете просто использовать базовые контроллеры для всего. Твой выбор.

Кроме этого, у вас есть 2 варианта. Для классов, которые практически не имеют возможности быть полиморфными (изменение поведения в зависимости от реализации), вы можете создавать статические классы и просто использовать их внутри своих контроллеров. Примером может служить класс, который выполняет математические вычисления, но они не являются полиморфными по своей природе.

Для всех остальных случаев я настоятельно рекомендую использовать инъекцию зависимостей. Одна из причин того, что модульное тестирование станет проще. Ниже приведено руководство о том, как это сделать для MVC 4 с использованием встроенного движка: https://www.asp.net/mvc/overview/older-versions/hands-on-labs/aspnet-mvc-4-dependency-injection. Если вы не хотите использовать его и используете Ninject или Simple Injector, вы можете реализовать свой собственный ControllerActivator и использовать, например, Ninject, чтобы получить экземпляр вашего контроллера.

При использовании инжектора зависимостей, как правило, контроллер получит зависимости в конструкторе, например:

public class StoreController : Controller 
{ 
    private IStoreService service; 

    public StoreController(IStoreService service) 
    { 
     // service in an injected dependency 
     this.service = service; 
    } 
} 

Для получения дополнительной информации, инъекции зависимостей Google ASP.NET.

+0

Спасибо, ребята, за ваши входы. На самом деле я поместил общий метод в BaseRepository, чтобы мои другие классы репозиториев могли наследовать. – GreenBinary