DevExpress.Mvvm.PocoToolkit

데브익스프레스의 POCO 스타일 뷰모델을 편히 활용하기 위해 만들어본 기초적인 라이브러리입니다.
현실적으로 (저를 비롯하여) 많은 분들이 닷넷프레임워크로 작업을 하고 계실 것이라고 생각을 합니다.
닷넷프레임워크에서는 소스제네레이터와 같은 끝내주는 기능을 지원받을 수 없기 때문에
데브익스프레스에서 지원하는 POCO 런타임 객체 생성 기능들을 활용할 수 없을까 고민하던 차에,
프리즘 라이브러리와 제임스님의 책자 내용을 참조하여 만들어 보았습니다.

6개의 좋아요

데브익스프레스의 POCO 는 사야 되는 거죠 ?
어떤 부분이 더 편하다는 건지 빡 와닿지 않아요…

3개의 좋아요

우선
재웅님의 Jamesnet.Wpf를 사용할때에는
CommunityToolkit.Mvvm 과 Prism을 사용해서 구축한 반면

데브익스프레스만의 기술로 Jamesnet.Wpf과 비슷한 기능을 구축했다는게 포인트 인것같네요!

2개의 좋아요

아니요 DX MVVM은 무료입니다.

옛날에 제가 세션에서 발표한 적도 있긴 했었는데, 당시에 소스제너레이터 기반 CommunityToolkit.Mvvm 이 없어서 저도 POCO ViewModel 스타일로 요긴하게 사용했었습니다.

실제로 CommunityToolkit에는 .NET 5 타겟팅 빌드가 없어서 .NET Standard 2.0 타겟팅 빌드를 사용합니다.

christian289/dotnetconfmini2205: .NET Conf Mini 22.05 발표 자료 및 예제 코드 (github.com)

5개의 좋아요

@석준_황 공유해주셔서 감사합니다!

POCO는 처음 보게 되었는데, Framework에서 소스제네레이터를 사용할 수 있는 좋은 대안이 될 것 같습니다!

3개의 좋아요

관심가져주셔서 너무 감사합니다! 설명이 누락된 부분 양해 부탁드립니다. 육아중이라 잠깐 앉아서 타자를 칠 짬이 안납니다. ^^; 조만간 부연설명을 드리도록 하겠습니다.

3개의 좋아요

DevExpress.MVVM은 데브익스프레스에서 MIT 라이선스로 제공하는 WPf의 MVVM 관련 오픈소스입니다. 그 중에서 POCO ViewModel 기능을 살펴보시면, 특정 애트리뷰트를 사용하여 런타임에 뷰모델 객체를 생성하면 보일러 플레이트에 해당하는 코드들을 상당히 줄여주는 기능이 포함되어 있습니다. 예를 들어 [Command] 애트리뷰트를 공개 메소드 위에 적어 둔 뒤에 특정한 방식으로 객체를 생성하면 자동으로 해당 메소드의 커맨드 패턴을 제공해 주는 방식입니다.(물론 생략도 가능)

이 기능의 지원을 받기 위해서는 ViewModelSource라고 하는 클래스의 Create 정적 메소드를 실행하여 런타임에 객체를 생성해야 합니다.(https://github.com/DevExpress/DevExpress.Mvvm.Free/blob/main/DevExpress.Mvvm/ViewModels/ViewModelSource.cs)
(소스 코드가 그렇게 간단하지 않지요? 이진 표현식, 리플렉션, il 생성기를 골고루 사용하고 있습니다. 데브익스프레스 팀에 박수를…) 이것을 좀 더 편리하게 관리하기 위해 뷰모델 객체를 싱글톤 컨테이너에 등록해 둔 뒤 찾아올 때는 POCO 스타일의 객체를 찾아오도록 설계해 두었습니다.

따라서 오토 와이어 기능을 통해 컨테이너에서 찾아온 모든 뷰모델은 자동으로 POCO 스타일의 뷰모델로 만들어지게 됩니다.

여기에 더해, 재웅님이 만들어주신 라이브러리를 참조하여 데브익스프레스의 Region 기능을 좀 더 직관적으로 사용할 수 있도록 만들어 두었는데, 해당 부분은 소스 내부의 예제를 참조해 주시면 될 것 같습니다.
물론 기능이 완벽하지는 않으므로 필요한 기능이 있을 때 적절히 살을 붙여서 사용하시면 맞춤형 라이브러리로 사용이 가능합니다.(아직까지는 라이브러리 자체에서 큰 문제는 발견되지 않아서 저도 실무에서 사용 중입니다. :grin:)

답변이 늦었습니다. 휴일이 되면 시간이 좀 생길 줄 알았는데, 더 정신없네요. :joy:

3개의 좋아요

저도 MVVM에 필요한 소스코드를 상당수 줄여준다는 점에 이전에 사용해본 유저로써 동의합니다.

제가 dxmvvm을 이용하던 시절은 .NET 5가 출시되었을 직후 였지만, .NET 6가 나오면서 Source Generator를 탑재한 MvvmLight의 계승인 CommunityToolkit.Mvvm을 MS에서 공식지원하면서 안쓰게 되었는데요.

혹시 계속 사용하시면서 CommunityToolkit.Mvvm에 비해서 장점이라고 생각하시는 부분이 있는지 궁금합니다.

아시겠지만 POCO ViewModel 형태는 Runtime 에서 디버깅할 때 조사식을 확인해보면 pocoviewmodel로 생성된 객체들은 타입뒤에 이상한 hash 값 비슷한게 붙어있어서 보기에 조금 지저분해서 보기 안좋았던 경험이 있었습니다.

4개의 좋아요

dxmvvm과의 비교를 위한 목적으로 사용하는 것이 아니라서 솔직히 잘 모르겠습니다. :sweat_smile: 앞서 말씀드린대로 닷넷 프레임워크 (+회사에서 사준 데브익스프레스…) 작업 환경에서의 대안을 찾아 본 것이기 때문에 사용자분들의 환경에 따라서 적절한 기술을 선택해 주시면 될 것 같네요! 그럼에도 불구하고 굳이 비교를 하자면, 데브 익스프레스에서 기본으로 제공하는 MIF 기능들이 꽤 괜찮아서 컨트롤별 모듈화를 고민하는 환경에서는 CommunityToolkit.Mvvm에 더해 프리즘을 추가하지 않아도 DevExpress.Mvvm 하나로 통일성있는 작업이 된다는 편리함은 있는 것 같습니다. 다만 참조 자료 자체는 대부분이 CommunityToolkit.Mvvm 기반이 많기 때문에 작업환경을 선택하실 수 있는 상태라면 자료가 많은 쪽을 선택하라고 권하고 싶습니다.
POCO ViewModel을 생성하면서 상속을 구현할 때 클래스 이름에 동적으로 UUID가 붙는 것은 기능적으로 특별히 불편하지는 않았습니다. :grin:

3개의 좋아요