Где хранить бизнес-логику в архитектуре MVC?

В моей компании мы недавно начали разработку приложения MVC. Наша задача - написать слой бизнес-логики, и в будущем он должен быть с меньшими затратами на обслуживание.

У нас есть несколько веб-сервисов для добавления / обновления / удаления информации о пользователях.

Теперь нам нужно добавить бизнес-логику, например:

Если поле Field1 на странице - «xxxx», тогда field2 должно быть в диапазоне от 1000 до 2000. Если field3 - это какой-то отдел, тогда field4 должно быть только в некоторых подотделах.

Итак, мы должны спроектировать слой так, чтобы в будущем наш администратор (у которого нет знаний в области программирования) мог войти и изменить логику, чтобы она работала. Пожалуйста, дайте мне несколько предложений.

Пока что у меня есть: запишите все эти условия в модели и подтвердите их, когда пользователь нажмет кнопку «Сохранить».

Заранее спасибо.


person user1882705    schedule 11.10.2013    source источник
comment
Лучший способ сделать это - это вариант этот пример .. но есть более простые способы выполнить базовую проверку, например DataAnnotations.   -  person Trevor Elliott    schedule 11.10.2013
comment
Если вы хотите, чтобы не разработчик мог настраивать бизнес-логику, я мог бы рассмотреть механизм правил .   -  person Michael    schedule 11.10.2013


Ответы (6)


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

Возможно, вам будет интересно прочитать это это.

Также проверьте Где находится «Слой бизнес-логики» подходит для приложения MVC?

person Rahul Tripathi    schedule 11.10.2013
comment
Вы имеете в виду, что мне нужно жестко закодировать все эти условия с помощью условий if else и сохранить их в модели - person user1882705; 11.10.2013
comment
Вы можете создать целую иерархию классов внутри модели, чтобы четко выразить вашу бизнес-логику. - person Marshall777; 11.10.2013
comment
Как сделать это редактируемым для лиц, не являющихся разработчиками в моей компании? Мой администратор, не обладающий техническими знаниями, также должен иметь возможность редактировать в будущем после того, как мы развернем это в производственной среде и покинем компанию. - person user1882705; 11.10.2013
comment
Итак, вы хотите, чтобы любой человек мог изменить ваш бизнес-уровень? Вроде не очень интересно! ;) - person Rahul Tripathi; 11.10.2013
comment
Не пласт, а логика? Я сказал своему менеджеру, что это невозможно, но он на этом настаивает. - person user1882705; 11.10.2013
comment
Не совсем уверен, но ищете ли вы что-то вроде этого: - stackoverflow.com/questions/10143307/? - person Rahul Tripathi; 11.10.2013
comment
Бизнес-логика должна храниться в другой сборке, модели и контроллеры взаимодействуют с этим уровнем. - person Ed DeGagne; 11.10.2013

Храните его в отдельной сборке, которая не знает о вашем слое пользовательского интерфейса. Ваши модели могут пойти сюда и обеспечить соблюдение бизнес-правил. Мне лично нравится строить бизнес-уровень на основе фреймворка Csla, который позволяет создавать многофункциональные модели с мощными правилами. Он ориентирован на развитие ntier, но я считаю, что он также совместим с ddd.

person Andy    schedule 11.10.2013

Когда вы говорите о layering, ваш бизнес-уровень должен быть отделен от уровня презентации. ASP.NET MVC - это технология представления; Итак, ваш бизнес-уровень будет в другой сборке. Кроме того, ваша бизнес-модель не будет использоваться непосредственно в ваших представлениях; вы можете использовать ViewModel для проверки ввода данных пользователем и, когда все будет в порядке, передать данные ViewModel в Business Entity.

Если вас интересует дополнительная информация о многоуровневых приложениях корпоративного уровня, я рекомендую вам Microsoft Spain - пример N-Layered .NET 4.0 с доменной ориентацией Приложение.

person Abbas Amiri    schedule 11.10.2013
comment
Microsoft Spain - доменно-ориентированное многоуровневое приложение .NET 4.0 - microsoftnlayerapp.codeplex.com - ссылка мертвых - person mvark; 16.09.2015
comment
@mvark, некоторая новая информация была предоставлена ​​автором по адресу blogs.msdn.com/b/cesardelatorre/archive/2010/03/26 / - person Abbas Amiri; 16.09.2015

Мне нравится использовать Entity Framework и Fluent Validation для создания уровня домена, который содержит как модели, так и валидаторы. Настройка выглядит так:

public abstract class DomainEntity
{
    private IValidator validator;

    protected DomainEntity(IValidator validator)
    {
        this.validator = validator;
    }

    public bool IsValid
    {
        get { return validator.IsValid; }
    }

    public ValidationResult Validate()
    {
        return validator.Validate();
    }
}

public class Person : DomainEntity
{
    public int Id { get; set; }
    public string Name { get; set; }

    public Person() : base(new PersonValidator())
}

public class PersonValidator() : AbstractValidator<Person>
{
    public PersonValidator()
    {
         ... validation logic
    }
}

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

person Neil Smith    schedule 11.10.2013

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

person VahiD    schedule 11.10.2013

Для этого вы можете использовать DataAnnotations - на самом деле аннотации данных позволяют не только проверять достоверность модели на стороне сервера. Они также могут давать подсказки для Entity Framework и сценариев на стороне клиента для проверки на стороне базы данных / клиента и добавлять метаданные к методам и свойствам, которые MVC может проверять.

например для модели:

class PersonDetailsModel
{
    [Required("Please enter a name")] // Don't allow no value, show the message when the rule is broken (if client side validation is enabled it shows when you tab off the control)
    [DisplayName("Full Name")] // Hint for MVC - show this when using the helper methods e.g. in MVC4 Razor syntax @Html.LabelFor(model => model.Name)
    public string Name { get; set; }
}

И да, сохраните как можно больше бизнес-логики на бизнес-уровне (модели). Если оставить в стороне общие проблемы, ваши компоненты должны быть как можно слабее связаны. Таким образом, есть центральное место для внесения изменений, ваш код более тестируемый и обслуживаемый, а также помогает поддерживать согласованность программирования (что помогает новичкам в вашем проекте быстро освоиться)

Если у вас есть более сложные правила, вы можете написать валидаторы EF.

http://msdn.microsoft.com/en-gb/data/gg193959.aspx

Если вы не используете Entity Framework, вы можете подумать об этом - если вы используете другой ORM, тогда, очевидно, используйте инструменты, которые его поддерживают. Если вы не используете ORM, есть альтернативы, но вам придется написать код для сантехники.

person Charleh    schedule 11.10.2013
comment
Использование одного и того же класса для ef и бизнес-модели - не лучшая идея. - person Andy; 11.10.2013
comment
Не сказал, просто привел пример проверки: P - person Charleh; 11.10.2013