Модель SQL ASP.NET MVC LINQ 2: где бизнес-логика? - PullRequest
1 голос
/ 16 сентября 2010

Я создаю первое приложение MVC в ASP.NET и использую модель link2SQL для работы с данными. Все учебные пособия на сайте Microsoft позволяют писать код LINQ в контроллере для получения данных и передачи их в представление, например:

 Function Index() As ActionResult
        Dim datacontext As New ErrorVaultDataContext
        Dim questions = From q In datacontext.Questions
                            Where q.fk_status_id = 1
                            Order By q.date Descending
                            Select q
        Return View(questions)
    End Function

Это работает, но меня смущает, где разместить свою бизнес-логику. Я хотел бы реализовать бизнес-логику типа "может ли этот пользователь получить эти данные?" в этом простом примере.

Кто-нибудь знает, как это работает в сочетании с linq 2 SQL?

Ответы [ 3 ]

2 голосов
/ 16 сентября 2010

вам нужно взглянуть на шаблоны за пределами MVC, например, шаблон Repository может быть хорошим местом для помещения LIN2SQL, а затем построения BLL (уровня бизнес-логики) между ним и вашими контроллерами для выполнения бизнес-логики

2 голосов
/ 16 сентября 2010

Этот запрос LINQ является бизнес-логикой.Проблема в том, что в этом примере он жестко закодирован в контроллере, что делает его привязанным к базе данных.

Вы можете абстрагировать его в интерфейс, который будет выполнять этот запрос, чтобы ваш контроллер больше не зависел от datacontext.Тогда у вас может быть реализация этого интерфейса, которая будет осуществлять фактический доступ к данным:

Public Interface IBusinessRepository
    Function GetQuestions(statusId As Integer) As IEnumerable(Of Question)
End Interface

Public Class BusinessRepositorySql
    Implements IBusinessRepository
    Public Function GetQuestions(statusId As Integer) As IEnumerable(Of Question) Implements IBusinessRepository.GetQuestions
        ' TODO: Perform the data access here
        Throw New NotImplementedException()
    End Function
End Class

Тогда контроллер может использовать бизнес-логику (в этом случае все, что ему нужно, это отфильтровать вопросы по какому-либо условию):

Public Class HomeController
    Inherits Controller
    Private ReadOnly _repository As IBusinessRepository
    Public Sub New(repository As IBusinessRepository)
        _repository = repository
    End Sub

    Public Function Index() As ActionResult
        Dim questions = _repository.GetQuestions(1)
        Return View(questions)
    End Function
End Class

Тогда вы можете создать фабрику пользовательских контроллеров , которая будет внедрять правильную реализацию в контроллер.

1 голос
/ 16 сентября 2010

Я согласен с Pharabus, независимо от того, какой уровень представления вы используете (webforms против mvc), вы, вероятно, захотите инкапсулировать свою бизнес-логику в свой собственный уровень. Таким образом, действия вашего контроллера будут вызывать объекты сервисного / бизнес-уровня вместо непосредственного использования контекста ORM (EF / linq2sql).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...