Где я должен поставить свою логическую логику контроллера в MVC3
Я понимаю, что MVC - это все, что нужно делать в правильном месте и логике, где это должно быть. Мои действия с контроллером заполняются бизнес-логикой (не связанной с хранением данных), и я чувствую, что я должен переместить часть логики в другое место.
Есть ли соглашение о том, где я должен поместить эту логику? Например, у меня есть следующий контроллер, который находится в файле контроллеров:
adminPowerController
public ActionResult Create(string test1)
// business logic
// business logic
// business logic
return View();
}
public ActionResult Index(string test1)
// business logic
// business logic
// business logic
return View();
}
Ответы
Ответ 1
Рекомендуемое место для размещения бизнес-логики - это уровень обслуживания. Таким образом, вы можете определить интерфейс, который будет представлять собой бизнес-операцию:
public interface IMyService
{
DomainModel SomeOperation(string input);
}
а затем выполнить эту службу. Наконец, контроллер будет использовать его:
public class MyController: Controller
{
private readonly IMyService _service;
public class MyController(IMyService service)
{
_service = service;
}
public ActionResult Create(string input)
{
var model = _service.SomeOperation(input);
var viewModel = Mapper.Map<DomainModel, ViewModel>(model);
return View(viewModel);
}
}
и настройте вашу инфраструктуру DI, чтобы передать правильную реализацию службы в контроллер.
Примечание. В приведенном примере я использовал AutoMapper для преобразования между моделью домена в модель представления, которая передается в представление.
Ответ 2
То, что я обычно делаю в проектах MVC, заключается в том, чтобы сохранить как можно больше бизнес-логики вне моих действий, чтобы я мог их протестировать
В некоторых случаях я создаю сервисный уровень, а затем использую
public class QuizRunner : IQuizRunner
{
private readonly IServiceProxyclient _quizServiceProxy;
public QuizRunner(IServiceProxyclient quizServiceProxy)
{
_quizServiceProxy = quizServiceProxy;
}
public GameCategory GetPrizeGameCategory(int prizeId)
{
return _quizServiceProxy.GetGameCategoryForPrizeId(prizeId);
}
}
public interface IQuizRunner
{
GameCategory GetPrizeGameCategory(int prizeId);
}
private IQuizRunner_serviceClass;
public AdminPowercontroller(IQuizRunner serviceClass)
{
_serviceClass = serviceClass;
}
public ActionResult Create(string test1)
var itemsFromLogic = _serviceClass.Method1();
return View();
}
public ActionResult Index(string test1)
var gameCategory = _serviceClass.GetPrizeGameCategory(test1);
var viewModel = Mapper.Map<GameCategory, GameCategoryViewModel>(gameCategory);
return View(viewModel);
}
это позволяет проверять мои действия отдельно от моего уровня обслуживания и без зависимости
Надеюсь, что это поможет
Пол
Ответ 3
Бизнес-логика должна жить в вашей модели домена, отделенной от среды MVC и других вещей.
Пример реального мира...
Приложение (один из моих сущностей домена):
[HttpPost]
public ActionResult Withdraw(int applicationId){
//find it from repository or whatever
var app=FindApplication(applicationId);
//force it do do stuff
a.Withdraw();
//send back some response
return RedirectToAction("Application",new{applicationId});
}
Сам объект приложения:
public class Application{
public void Withdraw(){
//check if current user is authorized to withdraw applications
Authorize<CanWithdrawApplications>();
//check if application itself can be withdrawn
ThrowIf(!CanBeWithdrawn(),"Application can't be withdrawn.");
//apply state changes
IsWithdrawn=true;
//raise domain event
Raise(new Withdrawn(this));
}
public bool CanBeWithdrawn(){
return !IsWithdrawn && !Project.Contract.IsSigned;
}
}
Подробнее об этом Вы можете проверить, что проект, управляемый доменом, о нем.