У меня возникли проблемы с поиском чистого способа реализации моих слоев.
Вот слои, которые у меня есть (нижние слои поддерживают верхние слои либо через наследование, либо через композицию):
Business Logic Layer (BLL)
Datastore Layer (DSL)
Database Layer (DBL), Web-Service Buffer (WSB)
Когда объект BLL делает запрос на получение, getRecords(), он, в свою очередь, просит DSL выполнить его.
Затем DSL решает, использовать ли локальный DBL или использовать WSB (который связывается с удаленным интерфейсом веб-службы с «главной» БД).
Вариант 1 - Композиция (BLL имеет DSL, DSL имеет DBL)
Моя проблема заключается в том, что, поскольку объекты DSL и DBL составлены внутри BLL, они ничего не знают о содержащемся BLL, и поэтому как они должны делать определенные запросы к БД, которые включают поля BLL?
Вариант 2 — Наследование (BLL: DSL, DSL: DBL)
Даже если нижние уровни теперь имеют доступ к BLL через общедоступное/защищенное наследование, все еще остается вопрос, как DSL и DBL должны точно знать, какие конкретные строки запроса генерировать. Я предполагаю, что BLL может хранить набор статических строк, но тогда это создает двустороннюю зависимость, что, как я полагаю, является действительно ошибочным дизайном с ужасными последствиями.
Примечание. У каждого BLL есть соответствующая таблица, в которую он сериализуется/десериализуется.
Примечание. Я не хочу использовать рефлексию и хотел бы ограничить использование дженериков (если только нет другого пути. Я использую дженерики для своего WSB, который отлично работает, хотя моя основная задача заключается в создании строк запроса, специфичных для BLL, в слоях DSL и DBL).
Примечание. Будет много различных объектов BLL, которые будут использовать слои DSL и DBL, а не только один (иначе это было бы тривиально).
public class BL1
{
private DSL _dsLayer;
public getRecords()
{
// ...
_dsLayer.getRecords();
// ...
}
}
public class DSL
{
private DBL _dbLayer;
private WSB _wsBuffer;
public getRecords()
{
if(_dbLayer.getRecords() != null)
{
return records;
}
else
{
return _wsBuffer.getRecords();
}
}
}
public class DBL
{
private string _db = "file.db3";
public getRecords()
{
select ????? - how to know what fields to grab
}
}
Спасибо, что нашли время ответить на этот вопрос, это очень ценно.