У меня есть веб-приложение. Я не верю, что технология важна. Структура представляет собой N-уровневое приложение, показанное на рисунке слева. Есть 3 слоя.
UI (шаблон MVC), уровень бизнес-логики (BLL) и уровень доступа к данным (DAL)
Проблема, которую я имею, состоит в том, что мой BLL огромен, поскольку в нем есть логика и пути для вызова событий приложения.
Типичный поток через приложение может быть:
Событие, генерируемое в пользовательском интерфейсе, переходит к методу в BLL, выполняет логику (возможно, в нескольких частях BLL), в конечном итоге к DAL, обратно к BLL (где, вероятно, больше логики), а затем возвращает некоторое значение в UI.
BLL в этом примере очень занят, и я думаю, как это разделить. У меня также есть логика и объединенные объекты, которые мне не нравятся.
Версия справа - мое усилие.
Логика по-прежнему заключается в том, как приложение перемещается между пользовательским интерфейсом и DAL, но, скорее всего, свойств нет ... Только методы (большинство классов на этом уровне могут быть статическими, поскольку они не хранят никакого состояния). Слой Poco - это место, где существуют классы, которые имеют свойства (например, класс Person, в котором есть имя, возраст, рост и т. Д.). Они не имеют ничего общего с потоком приложения, они только хранят состояние.
Поток может быть:
Даже запускается из пользовательского интерфейса и передает некоторые данные в контроллер уровня пользовательского интерфейса (MVC). Это преобразует необработанные данные и преобразует их в модель Poco. Затем модель poco передается на уровень логики (который был BLL) и, в конце концов, на уровень командных запросов, которые потенциально могут быть обработаны в пути. Уровень командных запросов преобразует POCO в объект базы данных (это почти одно и то же, но один предназначен для персистентности, другой - для внешнего интерфейса). Элемент сохраняется, и объект базы данных возвращается на уровень командного запроса. Затем он преобразуется в POCO, где он возвращается на уровень логики, потенциально обрабатывается дальше и, наконец, возвращается к пользовательскому интерфейсу.
Общая логика и интерфейсы - это место, где у нас могут быть постоянные данные, такие как MaxNumberOf_X и TotalAllowed_X и все интерфейсы.
И общая логика / интерфейсы, и DAL являются «основой» архитектуры. Они ничего не знают о внешнем мире.
Все знают о poco кроме общей логики / интерфейсов и DAL.
Поток все еще очень похож на первый пример, но он делает каждый слой более ответственным за одну вещь (будь то состояние, поток или что-то еще) ... но я нарушаю ООП с этим подходом?
Примером демонстрации Logic и Poco может быть:
public class LogicClass
{
private ICommandQueryObject cmdQuery;
public PocoA Method1(PocoB pocoB)
{
return cmdQuery.Save(pocoB);
}
/*This has no state objects, only ways to communicate with other
layers such as the cmdQuery. Everything else is just function
calls to allow flow via the program */
public PocoA Method2(PocoB pocoB)
{
pocoB.UpdateState("world");
return Method1(pocoB);
}
}
public struct PocoX
{
public string DataA {get;set;}
public int DataB {get;set;}
public int DataC {get;set;}
/*This simply returns something that is part of this class.
Everything is self-contained to this class. It doesn't call
trying to directly communicate with databases etc*/
public int GetValue()
{
return DataB * DataC;
}
/*This simply sets something that is part of this class.
Everything is self-contained to this class.
It doesn't call trying to directly communicate with databases etc*/
public void UpdateState(string input)
{
DataA += input;
}
}