Dreamine.Web 1.0.0.0
WPF와 Blazor를 한 코드 흐름으로 연결하고 반복적인 MVVM 코드를 줄이는 오픈소스 FullKit 공식 웹 애플리케이션입니다.
로딩중...
검색중...
일치하는것 없음
JsonLibraryStore.cs
이 파일의 문서화 페이지로 가기
1using System.IO;
2using System.Text.Json;
4
6
15public sealed class JsonLibraryStore : ILibraryStore
16{
25 private readonly string _path;
34 private List<LibraryInfo>? _cache;
43 private static readonly SemaphoreSlim _lock = new(1, 1);
44
53 private static readonly JsonSerializerOptions _json = new()
54 {
55 WriteIndented = true,
56 PropertyNamingPolicy = JsonNamingPolicy.CamelCase
57 };
58
76 {
77 var dir = opts.ResolvedDataPath;
78 Directory.CreateDirectory(dir);
79 _path = Path.Combine(dir, "libraries.json");
80 }
81
98 public async Task<List<LibraryInfo>> GetAllAsync()
99 {
100 if (_cache is not null) return _cache;
101
102 await _lock.WaitAsync();
103 try
104 {
105 if (_cache is not null) return _cache;
106
107 if (!File.Exists(_path))
108 {
110 await PersistAsync(_cache);
111 return _cache;
112 }
113
114 var json = await File.ReadAllTextAsync(_path);
115 _cache = JsonSerializer.Deserialize<List<LibraryInfo>>(json, _json) ?? [];
116
117 bool dirty = false;
118
119 // 시드에 있지만 JSON에 없는 항목 추가
120 var missing = SeedDefaults().Where(s => !_cache.Any(c => c.Id == s.Id)).ToList();
121 if (missing.Count > 0)
122 {
123 _cache.AddRange(missing);
124 dirty = true;
125 }
126
127 // 기존 항목에 시드에서 채울 수 있는 필드 백필
128 var seedMap = SeedDefaults().ToDictionary(s => s.Id);
129 foreach (var lib in _cache)
130 {
131 if (!seedMap.TryGetValue(lib.Id, out var seed)) continue;
132
133 if (string.IsNullOrEmpty(lib.DescriptionEn) && !string.IsNullOrEmpty(seed.DescriptionEn))
134 { lib.DescriptionEn = seed.DescriptionEn; dirty = true; }
135
136 if (string.IsNullOrEmpty(lib.RepoUrl) && !string.IsNullOrEmpty(seed.RepoUrl))
137 { lib.RepoUrl = seed.RepoUrl; dirty = true; }
138 }
139
140 if (dirty) await PersistAsync(_cache);
141
142 return _cache;
143 }
144 finally { _lock.Release(); }
145 }
146
171 public async Task<LibraryInfo?> GetAsync(string id)
172 {
173 var all = await GetAllAsync();
174 return all.FirstOrDefault(x => x.Id == id);
175 }
176
201 public async Task SaveAsync(LibraryInfo lib)
202 {
203 await _lock.WaitAsync();
204 try
205 {
206 var all = _cache ?? [];
207 var idx = all.FindIndex(x => x.Id == lib.Id);
208 lib.UpdatedAt = DateTime.UtcNow;
209 if (idx >= 0) all[idx] = lib;
210 else all.Add(lib);
211 _cache = all;
212 await PersistAsync(all);
213 }
214 finally { _lock.Release(); }
215 }
216
241 public async Task DeleteAsync(string id)
242 {
243 await _lock.WaitAsync();
244 try
245 {
246 var all = _cache ?? [];
247 all.RemoveAll(x => x.Id == id);
248 _cache = all;
249 await PersistAsync(all);
250 }
251 finally { _lock.Release(); }
252 }
253
278 private async Task PersistAsync(List<LibraryInfo> list)
279 {
280 var json = JsonSerializer.Serialize(list, _json);
281 await File.WriteAllTextAsync(_path, json);
282 }
283
300 private static List<LibraryInfo> SeedDefaults() =>
301 [
302 new() {
303 Id = "mvvm-core", Name = "Dreamine.MVVM.Core", Category = "MVVM", SortOrder = 1, Status = "stable", IsVisible = true,
304 Tags = ["mvvm","core"],
305 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.MVVM.Core",
306 Description = "ViewModel 기반 핵심 인프라. RelayCommand, ObservableObject, DI 자동 등록 포함.",
307 DescriptionEn = "Core infrastructure for ViewModel-based architecture. Includes RelayCommand, ObservableObject, and automatic DI registration."
308 },
309 new() {
310 Id = "mvvm-viewmodels", Name = "Dreamine.MVVM.ViewModels", Category = "MVVM", SortOrder = 2, Status = "stable", IsVisible = true,
311 Tags = ["mvvm","viewmodel"],
312 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.MVVM.ViewModels",
313 Description = "DreamineViewModel 베이스 클래스, IsBusy·StatusMessage 등 공통 상태 관리.",
314 DescriptionEn = "DreamineViewModel base classes with common state management — IsBusy, StatusMessage, and lifecycle hooks."
315 },
316 new() {
317 Id = "mvvm-interfaces", Name = "Dreamine.MVVM.Interfaces", Category = "MVVM", SortOrder = 3, Status = "stable", IsVisible = true,
318 Tags = ["mvvm","interface"],
319 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.MVVM.Interfaces",
320 Description = "IViewModel, INavigationService 등 핵심 추상화 인터페이스 모음.",
321 DescriptionEn = "Core abstraction interfaces — IViewModel, INavigationService, and related contracts."
322 },
323 new() {
324 Id = "mvvm-behaviors", Name = "Dreamine.MVVM.Behaviors", Category = "MVVM", SortOrder = 4, Status = "stable", IsVisible = true,
325 Tags = ["mvvm","behavior"],
326 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.MVVM.Behaviors",
327 Description = "플랫폼 독립 Behavior 베이스. EventToCommand 등 바인딩 헬퍼 포함.",
328 DescriptionEn = "Platform-independent Behavior base. Includes EventToCommand and other binding helpers."
329 },
330 new() {
331 Id = "mvvm-behaviors-core", Name = "Dreamine.MVVM.Behaviors.Core", Category = "MVVM", SortOrder = 5, Status = "stable", IsVisible = true,
332 Tags = ["mvvm","behavior","core"],
333 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.MVVM.Behaviors.Core",
334 Description = "플랫폼 공통 Behavior 코어 인터페이스 및 기반 클래스.",
335 DescriptionEn = "Core interfaces and base classes for cross-platform behaviors."
336 },
337 new() {
338 Id = "mvvm-behaviors-wpf", Name = "Dreamine.MVVM.Behaviors.Wpf", Category = "WPF", SortOrder = 6, Status = "stable", IsVisible = true,
339 Tags = ["wpf","behavior"],
340 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.MVVM.Behaviors.Wpf",
341 Description = "WPF 전용 Behavior 확장 — 드래그·드롭, 포커스, 키 트리거 등.",
342 DescriptionEn = "WPF-specific Behavior extensions — drag-drop, focus, key trigger, and more."
343 },
344 new() {
345 Id = "mvvm-locators", Name = "Dreamine.MVVM.Locators", Category = "MVVM", SortOrder = 7, Status = "stable", IsVisible = true,
346 Tags = ["mvvm","locator"],
347 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.MVVM.Locators",
348 Description = "ServiceLocator 패턴 구현. DI 컨테이너를 통한 ViewModel 조회.",
349 DescriptionEn = "ServiceLocator pattern implementation for ViewModel resolution via DI container."
350 },
351 new() {
352 Id = "mvvm-locators-wpf", Name = "Dreamine.MVVM.Locators.Wpf", Category = "WPF", SortOrder = 8, Status = "stable", IsVisible = true,
353 Tags = ["wpf","locator"],
354 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.MVVM.Locators.Wpf",
355 Description = "WPF DataTemplate 자동 연결 + DesignTime 지원 ViewModel Locator.",
356 DescriptionEn = "WPF DataTemplate auto-wiring and design-time ViewModel Locator support."
357 },
358 new() {
359 Id = "mvvm-extensions", Name = "Dreamine.MVVM.Extensions", Category = "MVVM", SortOrder = 9, Status = "stable", IsVisible = true,
360 Tags = ["mvvm","extensions"],
361 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.MVVM.Extensions",
362 Description = "IServiceCollection 확장 메서드 — ViewModel/Service 일괄 등록 등.",
363 DescriptionEn = "IServiceCollection extension methods for bulk ViewModel and Service registration."
364 },
365 new() {
366 Id = "mvvm-generators", Name = "Dreamine.MVVM.Generators", Category = "MVVM", SortOrder = 10, Status = "stable", IsVisible = true,
367 Tags = ["mvvm","generator","source-generator"],
368 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.MVVM.Generators",
369 Description = "Source Generator — [AutoRegister], [AutoNotify] 어트리뷰트 기반 코드 자동 생성.",
370 DescriptionEn = "Source Generator for [AutoRegister] and [AutoNotify] attribute-driven code generation."
371 },
372 new() {
373 Id = "mvvm-attributes", Name = "Dreamine.MVVM.Attributes", Category = "MVVM", SortOrder = 11, Status = "stable", IsVisible = true,
374 Tags = ["mvvm","attribute"],
375 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.MVVM.Attributes",
376 Description = "Generator·Framework에서 사용하는 어트리뷰트 정의 어셈블리.",
377 DescriptionEn = "Attribute definitions used by source generators and the Dreamine framework."
378 },
379 new() {
380 Id = "mvvm-wpf", Name = "Dreamine.MVVM.Wpf", Category = "WPF", SortOrder = 12, Status = "stable", IsVisible = true,
381 Tags = ["wpf","mvvm"],
382 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.MVVM.Wpf",
383 Description = "WPF 진입점 통합 패키지 — App 부트스트랩, Window 생명주기 관리.",
384 DescriptionEn = "WPF entry-point integration package — App bootstrap and Window lifecycle management."
385 },
386 new() {
387 Id = "hybrid", Name = "Dreamine.Hybrid", Category = "Hybrid", SortOrder = 20, Status = "stable", IsVisible = true,
388 Tags = ["hybrid","blazor"],
389 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.Hybrid",
390 Description = "Blazor Server를 Kestrel로 임베드하는 크로스플랫폼 하이브리드 호스트 코어.",
391 DescriptionEn = "Cross-platform hybrid host core that embeds a Blazor Server via Kestrel."
392 },
393 new() {
394 Id = "hybrid-wpf", Name = "Dreamine.Hybrid.Wpf", Category = "Hybrid", SortOrder = 21, Status = "stable", IsVisible = true,
395 Tags = ["hybrid","wpf","blazor"],
396 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.Hybrid.Wpf",
397 Description = "WPF + 임베디드 Blazor Server 하이브리드 패턴. WebView2 통합 포함.",
398 DescriptionEn = "WPF + embedded Blazor Server hybrid pattern with full WebView2 integration."
399 },
400 new() {
401 Id = "ui-abstractions", Name = "Dreamine.UI.Abstractions", Category = "UI", SortOrder = 30, Status = "stable", IsVisible = true,
402 Tags = ["ui","abstractions"],
403 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.UI.Abstractions",
404 Description = "플랫폼 공통 UI 인터페이스 — IPopupService, IThemeService 등.",
405 DescriptionEn = "Common UI interfaces across platforms — IPopupService, IThemeService, and more."
406 },
407 new() {
408 Id = "ui-wpf", Name = "Dreamine.UI.Wpf", Category = "UI", SortOrder = 31, Status = "stable", IsVisible = true,
409 Tags = ["ui","wpf"],
410 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.UI.Wpf",
411 Description = "WPF 전용 UI 통합 패키지 — 테마 적용, 팝업 서비스 연결.",
412 DescriptionEn = "WPF UI integration package — theme application and popup service wiring."
413 },
414 new() {
415 Id = "ui-wpf-controls", Name = "Dreamine.UI.Wpf.Controls", Category = "UI", SortOrder = 32, Status = "stable", IsVisible = true,
416 Tags = ["ui","wpf","controls"],
417 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.UI.Wpf.Controls",
418 Description = "다크 테마 WPF 커스텀 컨트롤 — DreamineButton, DreamineCheckLed, DreamineExpander 등.",
419 DescriptionEn = "Dark-theme WPF custom controls — DreamineButton, DreamineCheckLed, DreamineExpander, and more."
420 },
421 new() {
422 Id = "ui-winforms", Name = "Dreamine.UI.WinForms", Category = "UI", SortOrder = 33, Status = "stable", IsVisible = true,
423 Tags = ["ui","winforms","controls"],
424 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.UI.WinForms",
425 Description = "WinForms 다크 테마 컨트롤 라이브러리 — WPF Controls와 API 패리티 유지.",
426 DescriptionEn = "WinForms dark-theme control library maintaining API parity with WPF Controls."
427 },
428 new() {
429 Id = "ui-blazor", Name = "Dreamine.UI.Blazor", Category = "UI", SortOrder = 34, Status = "stable", IsVisible = true,
430 Tags = ["ui","blazor","components"],
431 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.UI.Blazor",
432 Description = "Blazor 다크 테마 컴포넌트 라이브러리 — DreamineDialogService, Popup 등.",
433 DescriptionEn = "Blazor dark-theme component library — DreamineDialogService, Popup, and modal components."
434 },
435 new() {
436 Id = "ui-wpf-equipment", Name = "Dreamine.UI.Wpf.Equipment", Category = "UI", SortOrder = 36, Status = "stable", IsVisible = true,
437 Tags = ["ui","wpf","equipment","industrial"],
438 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.UI.Wpf.Equipment",
439 Description = "산업 설비 특화 WPF 컨트롤 — 계기판, 게이지, 상태 표시 등.",
440 DescriptionEn = "Industrial equipment-specialized WPF controls — dashboards, gauges, and status displays."
441 },
442 new() {
443 Id = "ui-wpf-themes", Name = "Dreamine.UI.Wpf.Themes", Category = "UI", SortOrder = 37, Status = "stable", IsVisible = true,
444 Tags = ["ui","wpf","themes"],
445 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.UI.Wpf.Themes",
446 Description = "WPF 다크 테마 리소스 딕셔너리 — 색상 팔레트, 공통 스타일 정의.",
447 DescriptionEn = "WPF dark-theme ResourceDictionary — color palette and shared control style definitions."
448 },
449 new() {
450 Id = "ui-maui", Name = "Dreamine.UI.Maui", Category = "UI", SortOrder = 38, Status = "stable", IsVisible = true,
451 Tags = ["ui","maui","controls"],
452 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.UI.Maui",
453 Description = ".NET MAUI 다크 테마 컨트롤 라이브러리 — Cross-platform API 패리티.",
454 DescriptionEn = ".NET MAUI dark-theme control library with cross-platform API parity."
455 },
456 new() {
457 Id = "identity", Name = "Dreamine.Identity", Category = "Identity", SortOrder = 39, Status = "stable", IsVisible = true,
458 Tags = ["identity","oauth","auth","cookie"],
459 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.Identity",
460 Description = "OAuth 통합 로그인 라이브러리 — Google/Naver/Kakao 소셜 로그인, 로컬 이메일 로그인, 공용 쿠키/DataProtection 키 공유로 서비스 간 세션 공유.",
461 DescriptionEn = "OAuth-integrated login library — Google/Naver/Kakao social login, local email login, shared cookie and DataProtection keys for cross-service session sharing."
462 },
463 new() {
464 Id = "logging", Name = "Dreamine.Logging", Category = "Infrastructure", SortOrder = 40, Status = "stable", IsVisible = true,
465 Tags = ["logging"],
466 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.Logging",
467 Description = "구조화된 로깅 코어 — ILogSink, LogEntry, 파일/메모리 싱크 포함.",
468 DescriptionEn = "Structured logging core — ILogSink, LogEntry, file and memory sink support."
469 },
470 new() {
471 Id = "logging-wpf", Name = "Dreamine.Logging.Wpf", Category = "Infrastructure", SortOrder = 41, Status = "stable", IsVisible = true,
472 Tags = ["logging","wpf"],
473 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.Logging.Wpf",
474 Description = "WPF 전용 로그 싱크 — UI 스레드 안전 로그 바인딩.",
475 DescriptionEn = "WPF-specific log sink — UI thread-safe log binding for real-time display."
476 },
477 new() {
478 Id = "threading", Name = "Dreamine.Threading", Category = "Infrastructure", SortOrder = 50, Status = "stable", IsVisible = true,
479 Tags = ["threading","async"],
480 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.Threading",
481 Description = "비동기 작업 헬퍼 — AsyncQueue, PeriodicWorker, CancellationScope.",
482 DescriptionEn = "Async task helpers — AsyncQueue, PeriodicWorker, and CancellationScope."
483 },
484 new() {
485 Id = "threading-windows", Name = "Dreamine.Threading.Windows", Category = "Infrastructure", SortOrder = 51, Status = "stable", IsVisible = true,
486 Tags = ["threading","windows"],
487 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.Threading.Windows",
488 Description = "Windows 전용 스레딩 확장 — Dispatcher 통합, Windows 이벤트 핸들링.",
489 DescriptionEn = "Windows-specific threading extensions — Dispatcher integration and Windows event handling."
490 },
491 new() {
492 Id = "threading-wpf", Name = "Dreamine.Threading.Wpf", Category = "Infrastructure", SortOrder = 52, Status = "stable", IsVisible = true,
493 Tags = ["threading","wpf"],
494 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.Threading.Wpf",
495 Description = "WPF Dispatcher 기반 스레딩 헬퍼 — UI 스레드 안전 작업 큐.",
496 DescriptionEn = "WPF Dispatcher-based threading helpers — UI thread-safe task queue and scheduling."
497 },
498 new() {
499 Id = "database-abstractions", Name = "Dreamine.Database.Abstractions", Category = "Database", SortOrder = 60, Status = "stable", IsVisible = true,
500 Tags = ["database","abstractions"],
501 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.Database.Abstractions",
502 Description = "데이터베이스 공통 추상화 — IDbConnectionFactory, ITransaction 인터페이스.",
503 DescriptionEn = "Common database abstractions — IDbConnectionFactory, ITransaction, and IRepository interfaces."
504 },
505 new() {
506 Id = "database-core", Name = "Dreamine.Database.Core", Category = "Database", SortOrder = 61, Status = "stable", IsVisible = true,
507 Tags = ["database","dapper"],
508 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.Database.Core",
509 Description = "데이터베이스 코어 구현 — IRepository, IUnitOfWork, Dapper 통합.",
510 DescriptionEn = "Core database implementation — IRepository, IUnitOfWork, and Dapper integration."
511 },
512 new() {
513 Id = "database-sqlite", Name = "Dreamine.Database.Sqlite", Category = "Database", SortOrder = 62, Status = "stable", IsVisible = true,
514 Tags = ["database","sqlite"],
515 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.Database.Sqlite",
516 Description = "SQLite 전용 드라이버 및 마이그레이션 지원.",
517 DescriptionEn = "SQLite-specific driver with schema migration support."
518 },
519 new() {
520 Id = "database-mysql", Name = "Dreamine.Database.MySql", Category = "Database", SortOrder = 63, Status = "stable", IsVisible = true,
521 Tags = ["database","mysql"],
522 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.Database.MySql",
523 Description = "MySQL / MariaDB 전용 드라이버 및 연결 관리.",
524 DescriptionEn = "MySQL / MariaDB driver with connection management and query helpers."
525 },
526 new() {
527 Id = "database-sqlserver", Name = "Dreamine.Database.SqlServer", Category = "Database", SortOrder = 64, Status = "stable", IsVisible = true,
528 Tags = ["database","sqlserver"],
529 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.Database.SqlServer",
530 Description = "SQL Server 전용 드라이버 및 벌크 삽입 지원.",
531 DescriptionEn = "SQL Server driver with bulk insert and stored procedure support."
532 },
533 new() {
534 Id = "database-oracle", Name = "Dreamine.Database.Oracle", Category = "Database", SortOrder = 65, Status = "stable", IsVisible = true,
535 Tags = ["database","oracle"],
536 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.Database.Oracle",
537 Description = "Oracle DB 전용 드라이버 및 시퀀스 지원.",
538 DescriptionEn = "Oracle DB driver with sequence, stored procedure, and CLOB support."
539 },
540 new() {
541 Id = "comm-abstractions", Name = "Dreamine.Communication.Abstractions", Category = "Communication", SortOrder = 70, Status = "stable", IsVisible = true,
542 Tags = ["communication","abstractions"],
543 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.Communication.Abstractions",
544 Description = "통신 공통 추상화 — IClientProxy, IServerHub, IMessageSerializer 인터페이스.",
545 DescriptionEn = "Common communication abstractions — IClientProxy, IServerHub, and IMessageSerializer interfaces."
546 },
547 new() {
548 Id = "comm-core", Name = "Dreamine.Communication.Core", Category = "Communication", SortOrder = 71, Status = "stable", IsVisible = true,
549 Tags = ["communication","core"],
550 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.Communication.Core",
551 Description = "통신 코어 구현 — 연결 관리, 재연결, 메시지 라우팅.",
552 DescriptionEn = "Communication core implementation — connection management, auto-reconnect, and message routing."
553 },
554 new() {
555 Id = "comm-sockets", Name = "Dreamine.Communication.Sockets", Category = "Communication", SortOrder = 72, Status = "stable", IsVisible = true,
556 Tags = ["communication","sockets","tcp","udp"],
557 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.Communication.Sockets",
558 Description = "TCP/UDP 소켓 통신 구현 — 고성능 비동기 소켓 클라이언트/서버.",
559 DescriptionEn = "TCP/UDP socket communication — high-performance async socket client and server."
560 },
561 new() {
562 Id = "comm-serial", Name = "Dreamine.Communication.Serial", Category = "Communication", SortOrder = 73, Status = "stable", IsVisible = true,
563 Tags = ["communication","serial","rs232","rs485"],
564 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.Communication.Serial",
565 Description = "RS-232/485 시리얼 통신 — 자동 재연결, 프레임 파싱 지원.",
566 DescriptionEn = "RS-232/485 serial communication with auto-reconnect and frame parsing support."
567 },
568 new() {
569 Id = "comm-rabbitmq", Name = "Dreamine.Communication.RabbitMQ", Category = "Communication", SortOrder = 74, Status = "stable", IsVisible = true,
570 Tags = ["communication","rabbitmq","messaging"],
571 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.Communication.RabbitMQ",
572 Description = "RabbitMQ 메시지 브로커 통합 — Exchange/Queue/Routing 추상화.",
573 DescriptionEn = "RabbitMQ message broker integration — Exchange, Queue, and Routing key abstraction."
574 },
575 new() {
576 Id = "comm-wpf", Name = "Dreamine.Communication.Wpf", Category = "Communication", SortOrder = 75, Status = "stable", IsVisible = true,
577 Tags = ["communication","wpf"],
578 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.Communication.Wpf",
579 Description = "WPF 통신 연동 패키지 — UI 바인딩 친화적 통신 상태 관리.",
580 DescriptionEn = "WPF communication binding package — UI-friendly connection state and status management."
581 },
582 new() {
583 Id = "comm-fullkit", Name = "Dreamine.Communication.FullKit", Category = "Communication", SortOrder = 76, Status = "stable", IsVisible = true,
584 Tags = ["communication","fullkit","bundle"],
585 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.Communication.FullKit",
586 Description = "통신 라이브러리 전체 번들 — Sockets, Serial, RabbitMQ 일괄 참조.",
587 DescriptionEn = "Full communication bundle — Sockets, Serial, and RabbitMQ in a single reference."
588 },
589 new() {
590 Id = "io-abstractions", Name = "Dreamine.IO.Abstractions", Category = "IO", SortOrder = 80, Status = "stable", IsVisible = true,
591 Tags = ["io","abstractions"],
592 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.IO.Abstractions",
593 Description = "I/O 디바이스 공통 추상화 — IIoDevice, IIoChannel 인터페이스.",
594 DescriptionEn = "Common I/O device abstractions — IIoDevice and IIoChannel interfaces."
595 },
596 new() {
597 Id = "io-fastech-ethernet", Name = "Dreamine.IO.Fastech.Ethernet", Category = "IO", SortOrder = 81, Status = "stable", IsVisible = true,
598 Tags = ["io","fastech","ethernet","motion"],
599 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.IO.Fastech.Ethernet",
600 Description = "Fastech EtherNet/IP 모션 컨트롤러 드라이버.",
601 DescriptionEn = "Fastech EtherNet/IP motion controller driver with DI/DO and analog I/O support."
602 },
603 new() {
604 Id = "plc-abstractions", Name = "Dreamine.PLC.Abstractions", Category = "PLC", SortOrder = 90, Status = "stable", IsVisible = true,
605 Tags = ["plc","abstractions"],
606 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.PLC.Abstractions",
607 Description = "PLC 공통 추상화 — IPlcDriver, IPlcTag, IPlcMonitor 인터페이스.",
608 DescriptionEn = "Common PLC abstractions — IPlcDriver, IPlcTag, and IPlcMonitor interfaces."
609 },
610 new() {
611 Id = "plc-core", Name = "Dreamine.PLC.Core", Category = "PLC", SortOrder = 91, Status = "stable", IsVisible = true,
612 Tags = ["plc","core"],
613 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.PLC.Core",
614 Description = "PLC 코어 구현 — 태그 캐싱, 폴링 스케줄러, 연결 관리.",
615 DescriptionEn = "PLC core implementation — tag caching, polling scheduler, and connection management."
616 },
617 new() {
618 Id = "plc-mitsubishi-mc", Name = "Dreamine.PLC.Mitsubishi.MC", Category = "PLC", SortOrder = 92, Status = "stable", IsVisible = true,
619 Tags = ["plc","mitsubishi","mc","melsec"],
620 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.PLC.Mitsubishi.MC",
621 Description = "미쓰비시 MELSEC MC 프로토콜 드라이버 (3E/4E 프레임).",
622 DescriptionEn = "Mitsubishi MELSEC MC protocol driver supporting 3E and 4E frame formats."
623 },
624 new() {
625 Id = "plc-mitsubishi-mx", Name = "Dreamine.PLC.Mitsubishi.MxComponent", Category = "PLC", SortOrder = 93, Status = "stable", IsVisible = true,
626 Tags = ["plc","mitsubishi","mxcomponent"],
627 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.PLC.Mitsubishi.MxComponent",
628 Description = "미쓰비시 MX Component COM 기반 드라이버.",
629 DescriptionEn = "Mitsubishi MX Component COM-based driver for iQ-R and iQ-F series PLCs."
630 },
631 new() {
632 Id = "plc-omron-cx", Name = "Dreamine.PLC.Omron.CxComponent", Category = "PLC", SortOrder = 94, Status = "stable", IsVisible = true,
633 Tags = ["plc","omron","cxone"],
634 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.PLC.Omron.CxComponent",
635 Description = "옴론 CX-One 기반 드라이버 — FINS/UDP 프로토콜.",
636 DescriptionEn = "Omron CX-One based driver using FINS/UDP protocol for CJ and CS series PLCs."
637 },
638 new() {
639 Id = "plc-omron-fins", Name = "Dreamine.PLC.Omron.Fins", Category = "PLC", SortOrder = 95, Status = "stable", IsVisible = true,
640 Tags = ["plc","omron","fins","udp","tcp"],
641 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.PLC.Omron.Fins",
642 Description = "옴론 FINS 프로토콜 직접 구현 — UDP/TCP 이중 지원.",
643 DescriptionEn = "Direct Omron FINS protocol implementation with UDP and TCP dual transport support."
644 },
645 new() {
646 Id = "plc-wpf", Name = "Dreamine.PLC.Wpf", Category = "PLC", SortOrder = 96, Status = "stable", IsVisible = true,
647 Tags = ["plc","wpf","monitoring"],
648 RepoUrl = "https://github.com/CodeMaru-Dreamine/Dreamine.PLC.Wpf",
649 Description = "WPF PLC 모니터링 컨트롤 — 실시간 태그 바인딩, 알람 표시.",
650 DescriptionEn = "WPF PLC monitoring controls — real-time tag binding and alarm display panel."
651 },
652 ];
653}
async Task PersistAsync(List< LibraryInfo > list)
async Task SaveAsync(LibraryInfo lib)
static List< LibraryInfo > SeedDefaults()
async Task< LibraryInfo?> GetAsync(string id)
static readonly SemaphoreSlim _lock
static readonly JsonSerializerOptions _json
async Task< List< LibraryInfo > > GetAllAsync()