Каков наилучший способ использования LINQ to SQL в приложении C #?[Дизайн-шаблон] - PullRequest
4 голосов
/ 21 июня 2010

ОК, я всегда пытаюсь улучшить способ кодирования, потому что это моя страсть. У меня есть файл .dbml ( LINQ to SQL ), и я использую его для доступа к моей базе данных SQL Server .

Представьте, если хотите, что в вашей базе данных есть таблица Person, и вы хотите предоставить способ удаления, добавления и изменения записи Person.

В настоящее время я обрабатываю вещи, создавая классы PersonRepository, CarRepository, DocumentRepository и т. Д. Для каждой таблицы в моей базе данных я создаю класс репозитория.

Эти классы хранилища обычно состоят из чего-то похожего на это:

MyDatabaseContext db = new MyDatabaseContext();

public Person GetPersonByID(int id)
{
    return db.Person.Where(p => p.ID == id);
}

Практически то же самое для базовой функциональности CRUD каждой таблицы.

Если мне нужно что-то более конкретное, например, «Серхио, мне нужен список всех людей, рожденных между x и y»; затем я просто добавляю метод в класс PersonRepository.

public List<Person> GetPeopleFromDOB(DateTime x, DateTime y)
{
    // Do the logic here.
}

Еще одна идея, которая у меня возникла, заключалась в создании класса DataAccess.cs и включении всех этих методов (мы будем говорить о 4-5 методах для каждой существующей таблицы) и разделении их по регионам.

Что делают более знающие программисты и какие предложения вы бы предложили для энергичного молодого программиста (мне 20 лет)?

Ответы [ 3 ]

6 голосов
/ 21 июня 2010

Вот проблемы с тем, что вы делаете выше:

Использование списка, когда вы должны использовать IQueryable

Почему вместо этого следует использовать AsQueryable ()of List ()?

По сути, вы никогда не должны получать данные, пока они вам не понадобятся.При вашем подходе вы всегда получаете данные из базы данных, и последующие запросы LINQ будут действовать на все данные.Почему бы просто не создать запросы и позволить LINQ уточнить все там, где он получает то, что вам нужно, и только тогда, когда вам это нужно?

Использование методов, когда методы расширения будут идеальными

Вы создаете вспомогательный класс методов с такими вещами, как GetPeopleFromDOB.Почему бы не сделать это методом расширения?Если вы сделаете так, чтобы все они возвращали IQueryable, вы также можете использовать их последовательно.Например, GetPeople().StatusEnabled().BornInJuly().AgeIsGreaterThan( 57 ); Кроме того, если вы должны сделать это, по крайней мере, подумайте об этом в частичном классе или в статическом служебном классе.

Рассмотрите возможность использования шаблона ActiveRecord / Repository в качестве корневого

http://compiledexperience.com/blog/posts/Implementing-an-ActiveRecord-pattern-in-Linq-to-SQL

В данный момент вы создаете несколько жестко закодированных репозиториев, но вы должны основывать их на репозитории?

Почему бы не использовать валидаторы?

Если вы используете ASP.NET MVC, проверка является неотъемлемой частью, однако с веб-формами вы также можете использовать средства проверки аннотаций данных.

http://adventuresdotnet.blogspot.com/2009/08/aspnet-webforms-validation-with-data.html

2 голосов
/ 21 июня 2010

Вы захотите использовать репозиторий для прямого подключения к вашему DBML с использованием L2S.

Затем вы захотите создать службу , которая будет взаимодействовать с вашим хранилищем.

Наконец, вы будете использовать службу в таких вещах, как кодовый элемент или контроллер MVC.

Репозиторий пользователей

Namespace Data

#Region "Interface"
    Public Interface IUserRepository
        Function GetAllUsers() As IList(Of User)
        Function GetUserByID(ByVal id As Integer) As User
    End Interface
#End Region

#Region "Repository"
    Public Class UserRepository : Implements IUserRepository
        Private dc As MyDataContext
        Public Sub New()
            dc = New MyDataContext
        End Sub

        Public Function GetAllUsers() As System.Collections.Generic.IList(Of User) Implements IUserRepository.GetAllUsers
            Dim users = From u In dc.Users
                        Select u
            Return users.ToList
        End Function

        Public Function GetUserByID(ByVal id As Integer) As User Implements IUserRepository.GetUserByID
            Dim viewUser = (From u In dc.Users
                       Where u.ID = id
                       Select u).FirstOrDefault
            Return viewUser
        End Function

    End Class
#End Region
End Namespace

Сервис пользователя

Namespace Data

#Region "Interface"
    Public Interface IUserService
        Function GetAllUsers() As IList(Of User)
        Function GetUserByID(ByVal id As Integer) As User
    End Interface
#End Region


#Region "Service"
    Public Class UserService : Implements IUserService

        Private _ValidationDictionary As IValidationDictionary
        Private _UserRepository As IUserRepository

        Public Sub New(ByVal validationDictionary As IValidationDictionary, ByVal UserRepository As IUserRepository)
            _ValidationDictionary = validationDictionary
            _UserRepository = UserRepository
        End Sub

        Public Function GetAllUsers() As System.Collections.Generic.IList(Of User) Implements IUserService.GetAllUsers
            Return _UserRepository.GetAllUsers
        End Function


        Public Function GetUserByID(ByVal id As Integer) As User Implements IUserService.GetUserByID
            Return _UserRepository.GetUserByID(id)
        End Function

    End Class
#End Region
End Namespace

Теперь просто убедитесь, что вы используете CRUD , как вы упомянули выше.

Также, пожалуйста, прости мой VB. Возможно, вам понадобится запустить его через конвертер кода http://converter.telerik.com, чтобы получить C #.

2 голосов
/ 21 июня 2010

Я бы придерживался принципа одиночной ответственности и придерживался ваших классов репозитория.Если ваша база данных со временем увеличивается, представьте, насколько большим может стать класс DataAccess.Некоторое время вам это сойдет с рук, но оно будет расти и расти до такой степени, что у вас в классе тысячи строк кода (я уже видел более 15 000 строк в таком классе), и вы застряли!

...