Я хочу начать переписывать (шаг за шагом) уровень доступа к данным в старом приложении. Мы используем Entity Framework как объектный реляционный сопоставитель, поэтому «чистый доступ к данным» уже выполнен. Что еще нужно сделать, это предоставить «следующий» слой (я называю это потому, что сейчас неясно, останется ли старый бизнес-уровень вообще, это может привести к вопросу о том, где методы, о которых я говорю должен идти по слоям) с необходимыми методами для получения требуемых данных.Предоставлять различные интерфейсы доступа к данным из центрального класса: есть ли шаблон, который я мог/должен использовать?
Так как будет много методов, то их все в одном огромном интерфейсе/классе не кажется правильным способом сделать это со мной. Я предпочитаю разделять эти методы «получения данных» тематически. То есть примерно следующее:
interface IBillDataAccess { .. }
interface IAttestationDataAccess { .. }
interface ICustomerDataAccess { .. }
и так далее.
(1) Как вы думаете, полезно ли использовать интерфейсы вообще (я так думаю), даже если их реализация вряд ли изменится? Я должен добавить новые методы как для интерфейса, так и для реализации.
(2) Обычно я накапливал создание конкретной реализации этих интерфейсов внутри класса «поставщик», как я видел во многих наших небольших проектах раньше. Это, как правило, выглядит следующим образом (similar old question of mine, но теперь у меня есть способ более интерфейсов):
public static class DataAccessProvider
{
public static ICustomerDataAccess GetCustomerDataAccess()
{
return new CustomerDataAccess();
}
public static IBillDataAccess GetBillDataAccess()
{
return new BillDataAccess();
}
// and so on
}
Что-то об этом дизайне беспокоит меня, хотя я не могу положить палец на нем. Я уверен, что ваши мнения помогут мне здесь!
Другой пункт (пересекает с (1)): Я еще не уверен, что мне нравятся классы DataAccess
, не являющиеся статическими. Но наличие статических классов для этого означало бы, что я не могу использовать какой-либо интерфейс.
Я ценю любой вклад в этом, поскольку я действительно очень не уверен в этом, и, к сожалению, люди, которых я обычно спрашивал, пока не здесь. Не стесняйтесь сомневаться и критиковать все, что я сделал в приведенном выше;)
Это выглядит очень интересно, спасибо! У меня есть еще несколько вопросов: это все равно логически «принадлежит» уровню доступа к данным, не так ли? И это подтолкнуло бы меня к работе с долгосрочным контекстом, верно? Или иначе мне пришлось бы создать новый экземпляр 'Repository' для каждого доступа к данным и поместить его в оператор using с новым контекстом, который мне кажется неудобным. Или я неправильно понял вас? –
InvisiblePanda
Да, это относится к уровню доступа к данным, и вы можете создать общий репозиторий. то вам не нужно создавать экземпляр для каждого доступа к данным. проверьте ссылку и прочитайте последнюю часть статьи «Реализовать общий репозиторий и блок рабочего класса» – DevT
После того, как я попытался написать некоторый тестовый код с приведенным выше, я подумал, что мне вообще этого не нужно, безопасный доступ к данным и что он просто чувствует себя как ненужный уровень абстракции. Все, что я пробовал делать с этим шаблоном, оказалось короче и в основном делало то же самое с кратковременными контекстами.После некоторого большего чтения я нашел [этот пост в блоге] (http://rob.conery.io/2014/03/04/repositories-and-unitofwork-are-not-a-good-idea/), который сделал очень много смысл мне! – InvisiblePanda