2015-06-11 7 views
0

В настоящее время я использую шаблон DI и locator службы, чтобы получить экземпляр Service. (Обратите внимание, что Service only generic term im использует, и это не что иное, как класс C#, который вызывает репозиторий EF и выполняет операции с данными. Его служба NOT WCF)В MVC можно просматривать уровни доступа к сервисам ViewModels?

Можно ли иметь экземпляр службы в ViewModel? Если да, то какой способ передать экземпляр службы?

1> Если контроллер передает экземпляр службы в ViewModel. В этом случае Служба должным образом распределяется, когда контроллер получает удаленные

2> или должен ViewModel получить экземпляр службы, используя DI & Service Locator. В этом случае, как служба будет утилизирована?

BaseController

public class BaseController:Controller 
{ 
    private MyDomainService _myDomainServiceInstance = null; 

    protected MyDomainService MyDomainServiceInstance 
    { 
     get 
     { 
      if (_myDomainServiceInstance == null) 
      { 
       _myDomainServiceInstance = DefaultServiceLocator.Instance.GetInstance<MyDomainService>(); 
      } 

      return _myDomainServiceInstance; 
     } 
    } 

    protected override void Dispose(bool disposing) 
    { 
     base.Dispose(disposing); 
     if (_myDomainServiceInstance != null) 
     { 
      _myDomainServiceInstance.Dispose(); 
     } 
    } 
} 

Контроллер

public class MyController:BaseController 
{ 
    public ActionResult DoSomething() 
    { 
     var model = new SummaryVM(MyDomainServiceInstance); 
    } 
} 

ViewModel

public class SummaryVM 
{ 
    MyDomainService _myDomainService = null;   

    public SummaryVM(MyDomainService myDomainService) 
    { 
     //Approache 1: Controller is passing the service instance 
     _myDomainService = myDomainService; 
    } 

    public SummaryVM() 
    { 
     //Aprooche 2: Use DI & Service locator pattern to get the instance 
     _myDomainService = DefaultServiceLocator.Instance.GetInstance<MyDomainService>(); 
    } 

    public int[] SelectedClients { get; set; } 

    public string[] SelectedStates { get; set; } 


    public IEnumerable<Clients> PreSelectedClients 
    { 
     get 
     { 
      if (SelectedClients == null || !SelectedClients.Any()) 
      { 
       return new List<AutoCompletePreSelectedVM>(); 
      } 

      return _myDomainService.GetClients(SelectedClients); 
     } 
    } 
} 

ответ

0

я прошел беспересадочный ugh аналогичной ситуации. Я думаю, что это нормально, если служба домена получает экземпляр внутри модели представления. Служба домена может реализовать IDisposable, поэтому я буду создавать экземпляр внутри метода get вместо создания службы как атрибута.

+0

Да, служба домена уже имеет IDisposable. Однако при создании экземпляра Get есть один параметр, если у меня есть несколько свойств «получает», тогда он собирается создать новый экземпляр и поместить его для каждого get. это означает, что внутри он создаст SQL-соединение и будет располагаться на каждом «get» – LP13

+0

. Я вижу вашу точку зрения и соглашаюсь. Что делать, если вы инкапсулируете PreSelectedClients и инкапсулируете все остальные списки только для чтения и создаете метод, который заполняет эти поля. Контроллер будет вызывать этот метод перед возвратом viewmodel для просмотра. В этом методе вы можете создать экземпляр службы только один раз. – Murilo

1

Представленные модели предназначены для предоставления информации и из представлений и должны быть конкретными для приложения, в отличие от общего домена. Контроллеры должны организовывать взаимодействие с репозиториями, службами (здесь я делаю некоторые предположения об определении услуги) и т. Д., А также обрабатывают создание и проверку моделей представления, а также содержат логику определения представлений для рендеринга.

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

Просто не смешивайте понятия. Если ваш сервис имеет дело с моделями просмотра, то он должен быть презентационным сервисом и быть наложен поверх верхней модели. Модели для просмотра должны быть плоскими и простыми DTO, предназначенными для привязки к виду. Они не должны быть частью графика контейнера DI, потому что это усложняет ситуацию и затрудняет анализ кода.

+0

Im НЕ пропускает модель представления в «сервисный» слой, поэтому служба НЕ обращается к ViewModels. На самом деле это по-другому. ViewModels обращаются к службе. (см. код выше). Модели ViewModels находятся в папке «Модели» вместе с контроллерами в веб-проекте. Хотя служба домена - отдельная библиотека. Веб-проект имеет ссылку на доменную службу. и мой вопрос был как контроллер, может ли доступ к службе просмотра? если да, то где я должен распоряжаться сервисом в ViewModel. – LP13

+0

Еще один сценарий, в котором, как мне кажется, ViewModel должен иметь доступ к сервису/репозиторию - это когда вы хотите выполнить проверку модели на стороне сервера с помощью метода IValidatableObject и необходимо запросить базу данных в методе Validate. – LP13