Должны ли операции доступа к данным быть инкапсулированы во ViewModel или Controller? - PullRequest
0 голосов
/ 24 мая 2011

Одна из основных причин, по которой я хочу использовать ViewModel вместо модели, непосредственно в контроллере, заключается в том, что я замечаю, что контроллер, содержащий доступ к данным, кажется мне неподходящим для этой работы. Разве доступ к данным / запись чтения не должны выполняться во ViewModel?

такие вещи, как:

  1. Доступ к данным
  2. Чтение / запись
  3. Mapping
  4. Выбор списков

т.е. EF создал модель:

//------------------------------------------------------------------------------
// <auto-generated>
//    This code was generated from a template.
//
//    Manual changes to this file may cause unexpected behavior in your application.
//    Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace TestIODSManagement.Models
{
    using System;
    using System.Collections.Generic;

    public partial class ClientJob
    {
        public int Id { get; set; }
        public int ClientId { get; set; }
        public int JobTypeId { get; set; }
        public string OlapAppName { get; set; }
        public string EdgeAppName { get; set; }
        public Nullable<int> DatabaseServer { get; set; }
        public Nullable<int> ProcessingServer { get; set; }
        public Nullable<int> QueryServer { get; set; }
        public string DatabaseName { get; set; }
        public int DomainId { get; set; }
        public int CurrencyTypeId { get; set; }

        public virtual Client Client { get; set; }
        public virtual CurrencyType CurrencyType { get; set; }
        public virtual Domain Domain { get; set; }
        public virtual JobType JobType { get; set; }
        public virtual Server DbServer { get; set; }
        public virtual Server OpServer { get; set; }
        public virtual Server OqServer { get; set; }
    }
}

Возможная модель представления:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using TestIODSManagement.Models;

namespace TestIODSManagement.ViewModels
{
    public class ClientJobsViewModel
    {
        private DeploymentsEntities db = new DeploymentsEntities();

        public int Id { get; set; }
        public int ClientId { get; set; }
        public int JobTypeId { get; set; }
        public string OlapAppName { get; set; }
        public string EdgeAppName { get; set; }
        public Nullable<int> DatabaseServer { get; set; }
        public Nullable<int> ProcessingServer { get; set; }
        public Nullable<int> QueryServer { get; set; }
        public string DatabaseName { get; set; }
        public int DomainId { get; set; }
        public int CurrencyTypeId { get; set; }

        public virtual Client Client { get; set; }
        public virtual CurrencyType CurrencyType { get; set; }
        public virtual Domain Domain { get; set; }
        public virtual JobType JobType { get; set; }
        public virtual Server DbServer { get; set; }
        public virtual Server OpServer { get; set; }
        public virtual Server OqServer { get; set; }

        private List<Client> _clients;
        public IList<Client> Clients { get { return _clients.AsReadOnly(); } }

        private List<Domain> _domains;
        public IList<Domain> Domains { get { return _domains.AsReadOnly(); } }

        private List<CurrencyType> _currencyTypes;
        public IList<CurrencyType> CurrencyTypes { get { return _currencyTypes.AsReadOnly(); } }

        private List<JobType> _jobTypes;
        public IList<JobType> JobTypes { get { return _jobTypes.AsReadOnly(); } }

        private List<Server> _databaseServers;
        public IList<Server> DatabaseServers { get { return _databaseServers.AsReadOnly(); } }

        private List<Server> _processingServers;
        public IList<Server> ProcessingServers { get { return _processingServers.AsReadOnly(); } }

        private List<Server> _queryServers;
        public IList<Server> QueryServers { get { return _queryServers.AsReadOnly(); } }

        public ClientJobsViewModel(Client client)
        {
            ForceClientList(client);
            SetSelectLists();

        }

        public ClientJobsViewModel(int jobId)
        {
            ClientJob job = db.ClientJobs.Find(jobId);
            Client thisClient = db.Clients.Find(job.ClientId);
            ForceClientList(thisClient);
            SetSelectLists();
        }

        private void ForceClientList(Client client)
        {
            _clients = db.Clients
                .Where(c => c.Id == client.Id)
                .ToList();
        }

        private void SetSelectLists()
        {
            _databaseServers = db.Servers
                .Where(s => s.ServerPurpos.PurposeName == "DataWarehouse").ToList();
            _processingServers = db.Servers
                .Where(s => s.ServerPurpos.PurposeName == "Processing").ToList();
            _queryServers = db.Servers
                .Where(s => s.ServerPurpos.PurposeName == "Querying").ToList();
            _domains = db.Domains.ToList();
            _currencyTypes = db.CurrencyTypes.ToList();
            _jobTypes = db.JobTypes.ToList();
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 25 мая 2011

Существует разница между ViewModel и Model.ViewModel - это только пользовательский класс - ящик, который передает данные между представлением и контроллером строго типизированным способом.Модель - это «нечто», которое ваш контроллер вызывает для получения данных, бизнес-логики и т. Д. Это может быть уровень обслуживания, класс бизнес-логики, хранилище или что-то еще.Доступ к данным является частью модели.

0 голосов
/ 24 мая 2011

Вы правы в том, что контроллер - это не то место, но и модель представления.В идеале ваша модель представления должна содержать только свойства для инкапсуляции данных и редко какие-либо функциональные возможности.Я бы поместил всю эту логику в отдельный слой данных, или, если это маленький, простой проект, класс, предназначенный для доступа к данным.

Затем контроллер должен быть тем, кто вызовет этот уровень, класс или службу и запросит заполнение модели представления.

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