Подтвердить что ты не робот

Где я должен поставить свою логическую логику контроллера в 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();
  }
4b9b3361

Ответ 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;
 }
}

Подробнее об этом Вы можете проверить, что проект, управляемый доменом, о нем.