В настоящее время я использую шаблон 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);
}
}
}
Да, служба домена уже имеет IDisposable. Однако при создании экземпляра Get есть один параметр, если у меня есть несколько свойств «получает», тогда он собирается создать новый экземпляр и поместить его для каждого get. это означает, что внутри он создаст SQL-соединение и будет располагаться на каждом «get» – LP13
. Я вижу вашу точку зрения и соглашаюсь. Что делать, если вы инкапсулируете PreSelectedClients и инкапсулируете все остальные списки только для чтения и создаете метод, который заполняет эти поля. Контроллер будет вызывать этот метод перед возвратом viewmodel для просмотра. В этом методе вы можете создать экземпляр службы только один раз. – Murilo