Мы работаем над улучшением нашего DAL, написанного на LINQ, который взаимодействует с базой данных MS SQL. Наша цель - добиться хорошего повторного использования, используя как можно меньше кода.
Файлы, сгенерированные LINQ, используют обобщенные элементы и рефлексию для отображения классов, сгенерированных LINQ, в объекты SQL (в нашем случае таблицы и представления).
Пожалуйста, посмотрите пример существующего средства доступа. Этот метод находится в частичном классе, который содержит пользовательские конструкторы, методы доступа и мутаторы:
public clsDVD getDVD(int dvdId)
{
try
{
using (DataContext dvdDC = new DataContext(ConnectionStringManager.getLiveConnStr()))
{
// Deferred loading
dvdDC.DeferredLoadingEnabled = false;
var tDVD = dvdDC.GetTable<DVD>();
return (from t in tDVD
// Filter on DVD Id
where t.DVDId == (dvdId)
select t).Single();
}
catch (Exception e)
{
Logger.Log("Can't get requested DVD.", e);
throw;
}
}
Я считаю, что это очень легко поддерживать, так как большая часть работы выполняется после var tDVD
Было предложено вообще не объявлять tDVD
и использовать dataContext.TableName
, но за кулисами он все еще называет GetTable<>
.
Единственный способ улучшить это - разбить этот частичный класс на 4 (CRUD) частичных класса. Э.Г.
clsDVD_Select, clsDVD_Update, clsDVD_Insert, clsDVD_Delete
В этом случае каждый класс будет представлять набор поведений.
Идея, которую мы обсуждаем, состоит в том, чтобы посмотреть, возможно ли использовать дженерики поверх дженериков LINQ.
Например, вместо частичных классов мы выясняем свойства класса на ходу, используя отражение в базе данных SQL. Мое первое беспокойство здесь - это влияние на производительность. Насколько это будет значительным.
Вместо ClsDVD.getDVD(1231)
у нас будет что-то вроде: GenericDC.Select<DVD>(1231)
.Select
метод определит первичный ключ и выполнит запрос выбора для этой таблицы. Я изо всех сил пытаюсь понять, как это может работать. Допустим, мы можем заставить это работать для простого выбора, то есть выбора с фильтром по первичному ключу, но что произойдет, когда мы начнем делать сложные объединения и группировать по выборкам. Что происходит, когда мы хотим иметь несколько вариантов выбора для одного класса DVD?
Мое последнее беспокойство связано с хорошими практиками. Мне уже говорили, что хорошо иметь постоянный код. Например, если я решу использовать таблицы данных, я должен придерживаться таблиц данных на протяжении всего проекта. Это плохая идея иметь половину проекта с таблицами данных и другую половину с пользовательскими классами. Вы согласны с этим?
Я нахожусь в положении, когда я думаю, что существующая реализация довольно хороша, но, возможно, я упускаю что-то очень очевидное, и есть гораздо более простой, более оригинальный способ достижения тех же результатов?
Спасибо