Я использую базовый трехуровневый дизайн. В целях гибкости (и тестирования) я хотел, чтобы уровень данных был абстрактным и указывал конкретный класс в моем коде. Но как мне передать это своим бизнес-объектам? Вот пример (псевдокод):
abstract class IDataLayer
{
PersonData GetPerson(int); //PersonData would be a row of data from a table for example
JobData[] GetJobs(int);
void UpdatePerson(PersonData);
}
class ConcreteDataLayerSQL : IDataLayer
{
...
}
class ConcreteDataLayerXML : IDataLayer
{
...
}
class PersonBAL
{
void PersonBAL(personId)
{
//What goes here?
}
JobBAL[] GetJobs()
{
//What goes here?
}
}
class Program
{
static void Main()
{
person = new PersonBAL(1);
}
}
Итак, проблема в том, как PersonBAL узнает, какой ConcreteDataLayer использовать?
Я думаю между несколькими вариантами:
1: передать конкретный слой данных человеку. Это становится проблемой, когда вы начинаете добавлять новые классы, которые должны взаимодействовать со слоем данных (что-то вроде нового PersonBAL (IDataLayer, int), затем нового JobBAL (IDataLayer, int) и т. Д.)
2: создание статического объекта, который содержит используемый слой данных (Чтение: глобальная переменная)
Есть еще идеи?