Я работаю над своим первым настоящим приложением MVC, и я стараюсь следовать общим рекомендациям ООП. Я реорганизую простую бизнес-логику, которую я использовал в контроллере в моей модели домена. В последнее время я занимаюсь чтением, и кажется довольно ясным, что я должен поместить логику где-нибудь в классе сущности модели домена, чтобы избежать анти-шаблона «анонимной модели домена».ASP.NET MVC: Куда должна идти эта бизнес-логика?
Приложение позволит людям приобретать арендные платы за парковочные места. Ставки определяются по длине места и независимо от того, является ли клиент членом бизнес-парка.
Поэтому у меня есть классы сущностей в моей модели домена, которые выглядят так (упрощенно):
public class Customer
{
int ID { get; set; }
string Name { get; set; }
bool IsMember { get; set; }
}
public class ParkingSpace
{
int ID { get; set; }
int Length { get; set; }
}
public class ParkingSpaceLease
{
int ID { get; set; }
DateTime OpenDate { get; set; }
DateTime CloseDate { get; set; }
Customer Customer { get; set; }
ParkingSpace ParkingSpace { get; set; }
}
Edit: Просто уточнить LeaseQuote это не класс сущности, как он используется только для отображения разбивка затрат на перспективных клиентов и не сохраняется нигде.
Теперь, как функция приложения, мне нужно иметь возможность генерировать котировки для разных комбинаций клиентов и парковочных мест. Обычно кавычки можно получить за пределами контекста фактического создания аренды, например, когда клиент звонит, чтобы узнать цену.
Так что это лучший способ сделать это? Имеет ли смысл создать новый объект ParkingSpaceLease внутри контроллера только, чтобы вызвать метод GetQuote на нем?
var lease = new ParkingSpaceLease();
var quote = lease.GetQuote(length: 168, isMember: true);
return Json(quote);
Или должен ли класс LeaseQuote иметь метод?
var leaseQuote = new LeaseQuote();
var quote = leaseQuote.GetQuote(length: 168, isMember: true);
return Json(quote);
Чувствует себя странно, ставя логику в класс ParkingSpaceLease. Я думаю, что для создания нового объекта аренды я чувствую себя «тяжелым», когда знаю, что я не собираюсь на самом деле ничего делать с ним, кроме доступа к методу GetQuote, который кажется вроде отдельной службы.
Итак, куда должен идти метод GetQuote и зачем ему туда идти?
Вы правы в том, что LeaseQuote не является сущностью. Я должен был это ясно понять. Информация о покупке, дисконтном кредите и платеже будет отражена в транзакциях, которые происходят после фактического создания аренды, поэтому цель LeaseQuote - это просто отобразить разбивку для потенциальных клиентов. Что мне любопытно из вашего примера, почему нужно было бы передать все объекты Entity (Customer and Parking Space) вместо свойств, необходимых для выполнения расчета? –
Figured :) Итак, да, поместите расчет либо в другой класс Model (возможно, LeaseManager, который также может иметь методы для добавления новых договоров аренды, удаления лизинга, обновления лизинга и т. Д.) Или установить его на вашем контроллере, если вы считаете, t использовать где-либо еще. – villecoder
Не могли бы вы просто обратиться к моему вопросу о сигнатуре метода, принимающей объекты Entity, в отличие от значений свойств? Я отредактировал в вопросе, прежде чем вы отправили свой ответ! –