Socket 이라는 것 자체가 외부 자원(통신 I/O)에 대한 접근이라서, MVVM 중에 하나가 아니고, 이들이 의존하는 "서비스"로 취급합니다.
Socket 은 통신 I/O 의 기본 객체이기 때문에, HttpCient, WebClient, DatabaseConnection 등에서 사용되기도 합니다. 이 객체를 사용해보셔서 아시겠지만, 이 객체들은 Socket 을 외부로 노출하지 않습니다. 이와 유사하게, Socket 을 직접 노출하는 것 보다, 그 용도에 맞게 캡슐화하는 것이 좋습니다. 예를 들면,
public interface IMachineStatusService {}
public class SokcetBasedMachineStatusService : IMachineStatusService { }
class MyViewModel(IMachineStatusService service) { }
IMachineStatusService
는 직접 생성할 수도 있고,
partial class MyView
{
public MyView()
{
DataContext = new MyViewModel(new SokcetBasedMachineStatusService());
서비스 컨테이너를 통해 자동으로 주입되도록 할 수도 있습니다.
services.AddTransient<IMachineStatusService, SokcetBasedMachineStatusService>();
services.AddTransient<MyView>();
이 서비스를 반드시 뷰모델이 소비해야 하는 것은 아닙니다.
보통은 뷰가 소비하는 것이 자연스럽니다.
왜냐하면 뷰는 보통 생애 주기 메서드를 제공하는데, time-consuming (비동기) 작업의 호출 장소로 최적이기 때문입니다. (생성자에서 이런 작업을 수행하는 것은 좋지 않습니다.)
이 경우, 뷰모델은 서비스가 제공하는 데이터만 주입받는 구조가 됩니다.
class MyViewModel(IEnumerable<MachineStatus> stata) { }
데이터를 주입받을 때는 MyViewModel
은 서비스 컨테이너에 등록하는 것이 자연스럽지 않습니다.