Динамическая ViewModelBaseдля операций CRUD с использованием RIA - PullRequest
0 голосов
/ 27 марта 2011

Я ищу эффективный способ создания динамического CrudViewModelBase<TConext, TEntity>, который будет использоваться в качестве прототипа для всех ViewModel в приложении, которые будут выполнять операции CRUD.

IНе знаете, где эффективный способ создания DomainContext, должен быть на уровне приложения?ViewModel уровень?Пожалуйста, поделитесь со мной своим опытом.

Я довольно новичок в MVVM и хочу создать многоразовую ViewModelBase для выполнения этих операций.

Любые ссылки, примеры кода или рекомендации будутдействительно приветствую.

Я начинаю писать кое-что (я тоже новичок в RIA), я буду в течение нескольких часов извиняюсь за задержку в комментариях, и спасибо за сотрудничество:

Imports System.ServiceModel.DomainServices.Client
Imports Microsoft.Practices.Prism.ViewModel
Imports Microsoft.Practices.Prism.Commands
Imports CompleteKitchens.Model

Namespace ViewModel

  Public MustInherit Class CrudViewModel(Of TContext As DomainContext, TEntity As Entity)
    Inherits notificationobject

    Protected Sub New(context As DomainContext, query As EntityQuery(Of TEntity))
      m_Context = context
      m_Query = query
    End Sub

    Private ReadOnly m_Context As TContext
    Protected ReadOnly Property Context() As TContext
      Get
        Return m_Context
      End Get
    End Property

    Private ReadOnly m_Query As EntityQuery(Of TEntity)
    Protected ReadOnly Property Query As EntityQuery(Of TEntity)
      Get
        Return m_Query
      End Get
    End Property

    Private m_IsLoading As Boolean
    Public Overridable Property IsLoading As Boolean
      Get
        Return m_IsLoading
      End Get
      Protected Set(value As Boolean)
        m_IsLoading = value
        RaisePropertyChanged(Function() IsLoading)
      End Set
    End Property

    Private m_Items As IEnumerable(Of TEntity)
    Public Property Items() As IEnumerable(Of TEntity)
      Get
        Return m_Items
      End Get
      Set(ByVal value As IEnumerable(Of TEntity))
        m_Items = value
        RaisePropertyChanged(Function() Items)
      End Set
    End Property


    Private m_CanLoad As Func(Of Boolean)
    Protected Overridable ReadOnly Property CanLoad As Func(Of Boolean)
      Get
        If m_CanLoad Is Nothing Then m_CanLoad = Function() True
        Return m_CanLoad
      End Get
    End Property
    Private m_LoadCommand As ICommand
    Public ReadOnly Property LoadCommand() As ICommand
      Get
        If m_LoadCommand Is Nothing Then m_LoadCommand = New delegatecommand(AddressOf Load, CanLoad())
        Return m_LoadCommand
      End Get
    End Property
    Private Sub Load()
      IsLoading = True
      operation = Context.Load(Query, False)
    End Sub

    Private m_CanCancel As Func(Of Boolean) = Function() operation.CanCancel
    Protected Overridable ReadOnly Property CanCancel As Func(Of Boolean)
      Get
        Return m_CanCancel
      End Get
    End Property

    Private m_CancelCommand As ICommand
    Public ReadOnly Property CancelCommand() As ICommand
      Get
        If m_CancelCommand Is Nothing Then m_CancelCommand = New DelegateCommand(AddressOf Cancel, CanCancel())
        Return m_CancelCommand
      End Get
    End Property
    Private Sub Cancel()
      operation.Cancel()
    End Sub


    Private WithEvents operation As LoadOperation(Of TEntity)
    Private Sub operation_Completed(sender As Object, e As EventArgs) Handles operation.Completed
      If operation.IsComplete Then
        Items = operation.AllEntities
      ElseIf operation.IsCanceled Then



      End If
    End Sub
  End Class

End Namespace

1 Ответ

1 голос
/ 27 марта 2011

Как сказал Джедди, виртуальные машины и репозитории имеют дело с отдельными вещами.Как и в случае с ASP.net MVC, вы бы не попытались поместить это в свой контроллер.ViewModel предоставляет модель отображения и графического интерфейса.Думайте о ViewModel как о дисплее.Уберите представление, и вы сможете проверить его функциональность, протестировав ViewModel.

В моем текущем проекте я звоню в доменные службы RIA из ViewModel, а затем сопоставляю результаты смоя вм.Если вы хотите использовать шаблон репозитория, загрузите код с события firestarter silverlight.http://channel9.msdn.com/Series/Silverlight-Firestarter/Silverlight-Firestarter-2010-Session-3-Building-Feature-Rich-Business-Apps-Today-with-RIA-Services сессия 3 Дэн Валин, есть пример этого.Видео также неплохо смотрится.

Этот пример Шона Вильдермута показывает, что модель на стороне клиента фактически взаимодействует со службами RIA.Я еще не реализовал это, но для меня это имеет больше смысла, так как модель в его примере для меня больше похожа на контроллер.http://wildermuth.com/2010/04/16/Updated_RIA_Services_MVVM_Example

Мне лично не нравится привязывать объекты модели данных напрямую к ViewModels.В моем текущем проекте у меня нет выбора, потому что весь доступ осуществляется через procs, поэтому я отображаю результаты proc в ViewModels.Если бы у меня был доступ к таблицам, я бы, вероятно, по-прежнему отображал сущности модели данных в ViewModels.Я не уверен, что это «правильно» в шаблоне mvvm, но он позволяет вам сохранить ваши объекты модели данных чистыми от атрибутов отображения / проверки.

...