2015-07-04 2 views
0

Я работаю с MVC , как вы видите, я начинаю с этим ..Хорошая практика, где должна быть логика? MVC (бизнес уровень)

У меня есть построить простой модуль продажи

следующего код для возврата на частичный виде деталей.

Я не уверен, что весь этот код должен находиться на контроллере. где я могу поставить «логику»?

Я считаю, что это эквивалентно, мне нужен его «бизнес-уровень», но для mvc.

[HttpPost] 
public ActionResult getdetail(int productoid, int ventaid, float cantidad, string codigobarras) 
{ 
codigobarras =((string.IsNullOrEmpty(codigobarras))?"":codigobarras.ToLower()); 
Models.Helper.Ventah vh = new Models.Helper.Ventah(); 
vh.listadoclientes = db.accounts.ToList(); 
vh.listadoproductos = db.products.ToList(); 
vh.venta = db.sales.Where(x => x.id == ventaid).FirstOrDefault(); 
if (productoid == 0) 
{ 
//si es 0 lo busco por el código de barras 
vh.productoseleccionado = vh.listadoproductos.Where(x => x.code.ToLower().Equals(codigobarras)).FirstOrDefault(); 
} 
else { 
//busco el producto por el id 
vh.productoseleccionado = vh.listadoproductos.Where(x => x.id == productoid).FirstOrDefault(); 
} 

//regreso el partialview si el objecto es null, de lo contrario continuo 
//gracias a esto podre mandar un mensaje "producto no encontrado" 
if (vh.productoseleccionado == null) 
{ 
vh.mensaje = "No se encontró ningun producto con el código "+codigobarras; 
return PartialView(vh); 
} 
productoid = vh.productoseleccionado.id; 
//veo si ya tiene el producto agregado 
var detalle=vh.venta.saledetails.Where(x => x.idproduct == productoid).FirstOrDefault(); 

if (detalle != null)//significa que ya tiene el producto agregado por lo tanto solo lo sumo 
{ 
//valido que, quepa la cantidad que se ingresó 
if (vh.productoseleccionado.amount >= cantidad) 
{ 
vh.productoseleccionado.amount = vh.productoseleccionado.amount - cantidad; 
detalle.amount += cantidad; 
} 
} 
else//significa que no tiene el producto aún por lo tanto debo agregarlo 
{ 
//valido que, quepa la cantidaqd que se ingresó 
if (vh.productoseleccionado.amount >= cantidad) 
{ 
//agrego el detalle 
vh.venta.saledetails.Add(
//creo el detalle 
detalle = new Models.saledetail() 
{ 
amount = cantidad, 
idproduct = vh.productoseleccionado.id, 
idsale = vh.venta.id, 
inputprice = vh.productoseleccionado.inputprice, 
outputprice = vh.productoseleccionado.outputprice, 
ivaprice = vh.productoseleccionado.ivaprice, 
}); 
} 
} 
db.SaveChanges(); 
return PartialView(vh); 
} 

ответ

0

Я слышал об этом в двух вариантах толстой модели жира контроллера и точной модели жира. Это скорее зависит от того, как вы используете модель и контроллер. Скажем, например, у вас есть музыкальное приложение, а модель - это песня и пользователь. Было бы больше смысла в действии Purchase (в контроллере), чтобы пользователь приобрел песню ... вроде как User.Purchase(Song). Если что-то, что влияет на всю систему, скажем, переключатель включения/выключения сервера для обмена музыкой, может иметь логику, размещенную в контроллере, с проверкой модели, если у нее есть разрешение.

Этот вопрос слишком много касается личного/корпоративного выбора, и у каждого свои предпочтения, но, как правило, до тех пор, пока он имеет смысл в коде, все должно быть в порядке. Кроме логики в представлении .... избегать логики в представлении.

0

Что-то, что вы можете рассмотреть, это шаблон Service-Repository (или просто репозиторий) для работы вместе с MVC. Концепция здесь - Контроллер создает экземпляр объекта Service (слоя для логики для работы с данными) с объектом репозитория (слой, специально предназначенный для взаимодействия с базой данных). Самым большим преимуществом для этого является абстракция логики, особенно с точки зрения способности тестировать. Контроллер теперь отвечает за делегирование входящих данных и подготовку ответа, Служба обрабатывает бизнес-логику (где основная тяжесть тестируемого кода будет находиться), а репозиторий беспокоится только о доступе к данным. Ниже приведен пример того, как это будет продуман, хотя упрощена сложности логики:

контроллер

public ActionResult GetDetail(int Id) 
{ 
    // Do any manipulating of the data sent to the controller 

    // Instantiate a service for working with Products 
    var service = new ProductService(new ProductRepository("connectionString")); 

    // The method off the Service intended for this controller action 
    var modelForPartialView = service.GetProductDetail(Id); 

    // Return your updated model 
    return PartialView(modelForPartialView); 
} 

Service

private ProductRepository _productRepository; 

public ProductService(ProductRepository repo) 
{ 
    _productRepository = repo; 
} 

public Product GetProductDetail (int Id) 
{ 
    Product product = _productRepository.GetProductDetail(Id); 

    // Perform any business logic/manipulation on the Product before returning to the Controller 

    return product; 
} 

Repository

public ProductRepository(string connectionString) 
    { 
     // Connection instantiation 
    } 

    public Product GetProductDetail(int Id) 
    { 
     // Perform data access here 
     var data = DoDataAccess(); 

     // Potentially fill a data object as well 
     return FillProductWithData(data); 
    } 

Когда дело доходит до этого, разделение интереса является ключевым. Как далеко вы чувствуете, что вам нужно идти, чтобы достичь такого уровня разделения, зависит от вас.

0

Контроллер должен содержать только логику приложения, но не бизнес-логику. Бизнес-логика должна быть инкапсулирована в модели вашего домена, но не разбросана по контроллерам, что приведет к дублированию кода и высоким накладным расходам на обслуживание. Уровень сервиса может быть добавлен для обеспечения ряда функциональных возможностей, которые не могут быть выполнены только с помощью моделей доменов. Уровень сохранения, т. Е. Репозиторий должен обрабатывать отображение и сохранение моделей домена.

//controller 
public class ProductController : Controller{ 
    private CustomerService _customerService; 

    public ProductController(CustomerService customerService){ 
    _customerService = customerService; 
    } 

    [HttpPost] 
    public ActionResult Purchase(Product product){ 
    Boolean success = _customerService.Purchase(product); 

    return success ? RedirectToAction("Success") : RedirectToAction("Failure"); 

    } 
} 

Контроллер управляет логикой приложения, т.е.перенаправление клиента на соответствующую страницу на основе результата транзакции.

//service 
public class AppCustomerService : CustomerService{ 
    private Customer _currentCustomer; 
    private UnitOfWork _unitOfWork; 

    public AppCustomerService(UnitOfWork unitOfWork){ 
    _unitOfWork = unitOfWork; 
    _currentCustomer = _unitOfWork.CustomerRepository.Get(
     CustomerSession.Current.Id); 
    } 

    public Boolean Purchase(Product product){ 
    if(_currentCustomer.Purchase(product)){ 
     _unitOfWork.CustomerRepository.Update(_currentCustomer); 
     _unitOfWork.Save(); 
     return true; 
    } 

    return false; 
    } 
} 

класса обслуживания агрегатов необходимых средств, т.е. CustomerSession, клиенты и UnitOfWork для осуществления сделки купли-продажи.

//domain model 
public class Customer{ 

    private long _id; 
    private Money _accountBalance; 
    private List<Product> _products; 

    //list of property methods... 

    public Boolean Purchase(Product product){ 

    //example of business logic 

    if(_accountBalance < product.Price || product.Quantity == 0){ 
    return false; 
    } 

    _products.Add(product); 
    return true;  

    } 

} 

В модели домена должна быть реализована бизнес-логика покупки продукта, указанная в требованиях.

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