Я пытаюсь создать бизнес-уровни и уровни данных для моего большого приложения ASP.NET MVC. Поскольку я впервые пытаюсь реализовать проект такого масштаба, я читаю несколько книг и стараюсь правильно распределить вещи. Обычно мои приложения смешивают бизнес-логику и слои доступа к данным, и несколько бизнес-сущностей переплетаются в одном классе (что несколько раз смущало меня, когда я пытался выяснить, куда добавлять вещи).
Большая часть того, что я читал, - это разделение бизнес-уровня и уровня данных. Кажется, все хорошо, но у меня возникают проблемы с визуализацией, как именно это сделать в некоторых сценариях. Например, допустим, я создаю систему, которая позволяет администраторам добавлять новый продукт в систему:
public class Product
{
public int Id { get; private set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
Затем я разделяю доступ к данным, создавая хранилище
public class ProductRepository
{
public bool Add(Product product);
}
Допустим, я хочу, чтобы название продукта содержало не менее 4 символов. Я не вижу, как это сделать чисто.
Одна идея, которая у меня была, заключалась в том, чтобы расширить свойство set для Name и установить его, только если оно длиной 4 символа. Однако у метода, создающего продукт, нет способа узнать, что имя не задано, за исключением того, что Product.Name! = Что бы они ни передавали.
Еще одна идея, которая у меня была, - поместить ее в метод Add () в хранилище, но затем у меня есть бизнес-логика с логикой данных, которая также означает, что если вызов Add не удастся, я не знаю, если это не удалось из-за бизнес-логики или из-за сбоя DAL (и это также означает, что я не могу проверить его с помощью фиктивных сред).
Единственное, о чем я могу думать, - это поместить мои DAL-объекты в 3-й слой, который вызывается из метода Add () в репозитории, но я не вижу этого ни в одном из примеров моделирования предметной области в моей книге. или в Интернете (что я видел по крайней мере). Это также увеличивает сложность моделей предметной области, когда я не уверен, что это необходимо.
Другим примером является желание убедиться, что Имя используется только одним продуктом. Будет ли это в классе Product, методе AddRepository Add () или где?
В качестве дополнительного примечания я планирую использовать NHibernate в качестве своего ORM, однако для достижения того, чего я хочу (теоретически), не должно иметь значения, какой ORM я использую, поскольку TDD должен быть способен изолировать все это.
Заранее спасибо!