Dreamine.Web 1.0.0.0
WPF와 Blazor를 한 코드 흐름으로 연결하고 반복적인 MVVM 코드를 줄이는 오픈소스 FullKit 공식 웹 애플리케이션입니다.
로딩중...
검색중...
일치하는것 없음
DreamineWeb.Services.LibraryCatalogSyncService 클래스 참조sealed

더 자세히 ...

DreamineWeb.Services.LibraryCatalogSyncService에 대한 협력 다이어그램:

Public 멤버 함수

 LibraryCatalogSyncService (ILibraryStore store, DreamineOptions opts)
async Task< LibraryCatalogSyncResultSyncAsync ()

속성

bool IsConfigured [get]

Private 멤버 함수

bool ApplyProjectMetadata (LibraryInfo lib, ProjectMetadata project)
record ProjectMetadata (string ProjectPath, string PackageId, string Version, string TargetFramework, string? Description, string? RepositoryUrl, string[] Tags, string[] Dependencies, string Category)

정적 Private 멤버 함수

static ? ProjectMetadata ReadProject (string path)
static string InferCategory (string packageId)
static int CategoryRank (string category)
static string ToId (string packageId)
static ? string Normalize (string? value)
static string[] SplitTags (string? tags)
static bool SameSet (string[] left, string[] right)
static bool SetString (string? current, string? value, Action< string?> assign)

Private 속성

readonly ILibraryStore _store
readonly string _libRoot
readonly string _xmlDocRoot

정적 Private 속성

static readonly Regex Whitespace = new(@"\s+", RegexOptions.Compiled)

상세한 설명

Library Catalog Sync Service 기능과 관련 상태를 캡슐화합니다.

LibraryCatalogSyncService.cs 파일의 16 번째 라인에서 정의되었습니다.

생성자 & 소멸자 문서화

◆ LibraryCatalogSyncService()

DreamineWeb.Services.LibraryCatalogSyncService.LibraryCatalogSyncService ( ILibraryStore store,
DreamineOptions opts )
inline

지정한 설정으로 LibraryCatalogSyncService 클래스의 새 인스턴스를 초기화합니다.

매개변수
storestore에 사용할 ILibraryStore 값입니다.
optsopts에 사용할 DreamineOptions 값입니다.

LibraryCatalogSyncService.cs 파일의 80 번째 라인에서 정의되었습니다.

81 {
82 _store = store;
83 _libRoot = opts.LibrarySourceRoot;
84 _xmlDocRoot = Path.Combine(AppContext.BaseDirectory, "wwwroot", "xmldocs");
85 }

다음을 참조함 : _libRoot, _store, _xmlDocRoot, DreamineWeb.Models.DreamineOptions.LibrarySourceRoot.

멤버 함수 문서화

◆ ApplyProjectMetadata()

bool DreamineWeb.Services.LibraryCatalogSyncService.ApplyProjectMetadata ( LibraryInfo lib,
ProjectMetadata project )
inlineprivate

Apply Project Metadata 작업을 수행합니다.

매개변수
liblib에 사용할 LibraryInfo 값입니다.
projectproject에 사용할 ProjectMetadata 값입니다.
반환값
Apply Project Metadata 조건이 충족되면 true이고, 그렇지 않으면 false입니다.

LibraryCatalogSyncService.cs 파일의 203 번째 라인에서 정의되었습니다.

204 {
205 var dirty = false;
206
207 if (SetString(lib.Name, project.PackageId, v => lib.Name = v ?? string.Empty)) dirty = true;
208 if (SetString(lib.Category, project.Category, v => lib.Category = v ?? string.Empty)) dirty = true;
209 if (SetString(lib.Version, project.Version, v => lib.Version = v ?? string.Empty)) dirty = true;
210 if (SetString(lib.NuGetId, project.PackageId, v => lib.NuGetId = v)) dirty = true;
211 if (SetString(lib.SourceProjectPath, project.ProjectPath, v => lib.SourceProjectPath = v)) dirty = true;
212 if (SetString(lib.TargetFramework, project.TargetFramework, v => lib.TargetFramework = v)) dirty = true;
213
214 if (!string.IsNullOrWhiteSpace(project.Description))
215 {
216 if (SetString(lib.DescriptionEn, project.Description, v => lib.DescriptionEn = v)) dirty = true;
217 if (string.IsNullOrWhiteSpace(lib.Description))
218 {
219 lib.Description = project.Description;
220 dirty = true;
221 }
222 }
223
224 if (!string.IsNullOrWhiteSpace(project.RepositoryUrl))
225 {
226 if (SetString(lib.RepoUrl, project.RepositoryUrl, v => lib.RepoUrl = v)) dirty = true;
227 }
228
229 if (project.Tags.Length > 0 && !SameSet(lib.Tags, project.Tags))
230 {
231 lib.Tags = project.Tags;
232 dirty = true;
233 }
234
235 if (!SameSet(lib.Dependencies, project.Dependencies))
236 {
237 lib.Dependencies = project.Dependencies;
238 dirty = true;
239 }
240
241 var xmlPath = Path.Combine(_xmlDocRoot, project.PackageId, $"{project.PackageId}.xml");
242 if (File.Exists(xmlPath))
243 {
244 if (SetString(lib.XmlDocPath, xmlPath, v => lib.XmlDocPath = v)) dirty = true;
245 }
246
247 if (dirty) lib.UpdatedAt = DateTime.UtcNow;
248 return dirty;
249 }

다음을 참조함 : _xmlDocRoot, DreamineWeb.Models.LibraryInfo.Category, DreamineWeb.Models.LibraryInfo.Dependencies, DreamineWeb.Models.LibraryInfo.Description, DreamineWeb.Models.LibraryInfo.DescriptionEn, DreamineWeb.Models.LibraryInfo.Name, DreamineWeb.Models.LibraryInfo.NuGetId, ProjectMetadata(), DreamineWeb.Models.LibraryInfo.RepoUrl, SameSet(), SetString(), DreamineWeb.Models.LibraryInfo.SourceProjectPath, DreamineWeb.Models.LibraryInfo.Tags, DreamineWeb.Models.LibraryInfo.TargetFramework, DreamineWeb.Models.LibraryInfo.Version, DreamineWeb.Models.LibraryInfo.XmlDocPath.

다음에 의해서 참조됨 : SyncAsync().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ CategoryRank()

int DreamineWeb.Services.LibraryCatalogSyncService.CategoryRank ( string category)
inlinestaticprivate

Category Rank 작업을 수행합니다.

매개변수
categorycategory에 사용할 string 값입니다.
반환값
Category Rank 작업에서 생성한 int 결과입니다.

LibraryCatalogSyncService.cs 파일의 415 번째 라인에서 정의되었습니다.

415 => category switch
416 {
417 "MVVM" => 1,
418 "Hybrid" => 2,
419 "UI" => 3,
420 "Identity" => 4,
421 "Infrastructure" => 5,
422 "Database" => 6,
423 "Communication" => 7,
424 "IO" => 8,
425 "PLC" => 9,
426 _ => 99
427 };

다음에 의해서 참조됨 : SyncAsync().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ InferCategory()

string DreamineWeb.Services.LibraryCatalogSyncService.InferCategory ( string packageId)
inlinestaticprivate

Infer Category 작업을 수행합니다.

매개변수
packageIdpackage Id에 사용할 string 값입니다.
반환값
Infer Category 작업에서 생성한 string 결과입니다.

LibraryCatalogSyncService.cs 파일의 376 번째 라인에서 정의되었습니다.

377 {
378 if (packageId.StartsWith("Dreamine.MVVM.", StringComparison.OrdinalIgnoreCase)) return "MVVM";
379 if (packageId.StartsWith("Dreamine.UI.", StringComparison.OrdinalIgnoreCase)) return "UI";
380 if (packageId.StartsWith("Dreamine.Communication.", StringComparison.OrdinalIgnoreCase)) return "Communication";
381 if (packageId.StartsWith("Dreamine.Database.", StringComparison.OrdinalIgnoreCase)) return "Database";
382 if (packageId.StartsWith("Dreamine.PLC.", StringComparison.OrdinalIgnoreCase)) return "PLC";
383 if (packageId.StartsWith("Dreamine.IO.", StringComparison.OrdinalIgnoreCase)) return "IO";
384 if (packageId.StartsWith("Dreamine.Threading", StringComparison.OrdinalIgnoreCase)) return "Infrastructure";
385 if (packageId.StartsWith("Dreamine.Logging", StringComparison.OrdinalIgnoreCase)) return "Infrastructure";
386 if (packageId.StartsWith("Dreamine.Hybrid", StringComparison.OrdinalIgnoreCase)) return "Hybrid";
387 if (packageId.StartsWith("Dreamine.Identity", StringComparison.OrdinalIgnoreCase)) return "Identity";
388 return "Other";
389 }

다음에 의해서 참조됨 : ReadProject().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ Normalize()

? string DreamineWeb.Services.LibraryCatalogSyncService.Normalize ( string? value)
inlinestaticprivate

Normalize 작업을 수행합니다.

매개변수
value적용할 값입니다.
반환값
Normalize 작업에서 생성한 string? 결과입니다.

LibraryCatalogSyncService.cs 파일의 486 번째 라인에서 정의되었습니다.

487 {
488 if (string.IsNullOrWhiteSpace(value)) return null;
489 return Whitespace.Replace(value.Trim(), " ");
490 }

다음을 참조함 : Whitespace.

다음에 의해서 참조됨 : ReadProject().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ ProjectMetadata()

record DreamineWeb.Services.LibraryCatalogSyncService.ProjectMetadata ( string ProjectPath,
string PackageId,
string Version,
string TargetFramework,
string? Description,
string? RepositoryUrl,
string[] Tags,
string[] Dependencies,
string Category )
sealedprivate

Project Metadata 기능과 관련 상태를 캡슐화합니다.

다음에 의해서 참조됨 : ApplyProjectMetadata(), ReadProject(), SyncAsync().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ ReadProject()

? ProjectMetadata DreamineWeb.Services.LibraryCatalogSyncService.ReadProject ( string path)
inlinestaticprivate

Project 데이터를 읽습니다.

매개변수
pathpath에 사용할 string 값입니다.
반환값
Read Project 작업에서 생성한 ProjectMetadata? 결과입니다.

LibraryCatalogSyncService.cs 파일의 275 번째 라인에서 정의되었습니다.

276 {
277 try
278 {
279 var doc = XDocument.Load(path);
280 var root = doc.Root;
281 if (root is null) return null;
282
283 #pragma warning disable CS1587
310 string? Property(string name) => root.Elements("PropertyGroup")
311 .Elements(name)
312 .Select(x => x.Value.Trim())
313 .FirstOrDefault(x => !string.IsNullOrWhiteSpace(x));
314 #pragma warning restore CS1587
315
316 var assemblyName = Path.GetFileNameWithoutExtension(path);
317 var packageId = Property("PackageId") ?? Property("AssemblyName") ?? assemblyName;
318 var version = Property("Version");
319 if (string.IsNullOrWhiteSpace(version) || version.Contains("$(", StringComparison.Ordinal))
320 version = "1.0.0";
321
322 var targetFramework = Property("TargetFramework") ?? Property("TargetFrameworks") ?? string.Empty;
323 var description = Normalize(Property("Description"));
324 var tags = SplitTags(Property("PackageTags"));
325 var dependencies = root.Elements("ItemGroup")
326 .Elements("ProjectReference")
327 .Select(x => x.Attribute("Include")?.Value)
328 .Where(x => !string.IsNullOrWhiteSpace(x))
329 .Select(x => Path.GetFileNameWithoutExtension(x!))
330 .Where(x => !string.IsNullOrWhiteSpace(x))
331 .Distinct(StringComparer.OrdinalIgnoreCase)
332 .OrderBy(x => x, StringComparer.OrdinalIgnoreCase)
333 .ToArray();
334
335 return new ProjectMetadata(
336 path,
337 packageId,
338 version,
339 targetFramework,
340 description,
341 Property("RepositoryUrl") ?? Property("PackageProjectUrl"),
342 tags,
343 dependencies,
344 InferCategory(packageId));
345 }
346 catch
347 {
348 return null;
349 }
350 }

다음을 참조함 : InferCategory(), Normalize(), ProjectMetadata(), DreamineWeb.Models.Property, SplitTags().

다음에 의해서 참조됨 : SyncAsync().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ SameSet()

bool DreamineWeb.Services.LibraryCatalogSyncService.SameSet ( string[] left,
string[] right )
inlinestaticprivate

Same Set 작업을 수행합니다.

매개변수
leftleft에 사용할 string[] 값입니다.
rightright에 사용할 string[] 값입니다.
반환값
Same Set 조건이 충족되면 true이고, 그렇지 않으면 false입니다.

LibraryCatalogSyncService.cs 파일의 556 번째 라인에서 정의되었습니다.

556 =>
557 left.OrderBy(x => x, StringComparer.OrdinalIgnoreCase)
558 .SequenceEqual(right.OrderBy(x => x, StringComparer.OrdinalIgnoreCase), StringComparer.OrdinalIgnoreCase);

다음에 의해서 참조됨 : ApplyProjectMetadata().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ SetString()

bool DreamineWeb.Services.LibraryCatalogSyncService.SetString ( string? current,
string? value,
Action< string?> assign )
inlinestaticprivate

String 값을 설정합니다.

매개변수
currentcurrent에 사용할 string? 값입니다.
value적용할 값입니다.
assignassign에 사용할 Action<string?> 값입니다.
반환값
Set String 조건이 충족되면 true이고, 그렇지 않으면 false입니다.

LibraryCatalogSyncService.cs 파일의 600 번째 라인에서 정의되었습니다.

601 {
602 value = string.IsNullOrWhiteSpace(value) ? null : value;
603 if (string.Equals(current, value, StringComparison.Ordinal)) return false;
604 assign(value);
605 return true;
606 }

다음에 의해서 참조됨 : ApplyProjectMetadata().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ SplitTags()

string[] DreamineWeb.Services.LibraryCatalogSyncService.SplitTags ( string? tags)
inlinestaticprivate

Split Tags 작업을 수행합니다.

매개변수
tagstags에 사용할 string? 값입니다.
반환값
Split Tags 작업에서 생성한 string[] 결과입니다.

LibraryCatalogSyncService.cs 파일의 516 번째 라인에서 정의되었습니다.

516 =>
517 string.IsNullOrWhiteSpace(tags)
518 ? []
519 : tags.Split([';', ','], StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)
520 .Distinct(StringComparer.OrdinalIgnoreCase)
521 .OrderBy(x => x, StringComparer.OrdinalIgnoreCase)
522 .ToArray();

다음에 의해서 참조됨 : ReadProject().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ SyncAsync()

async Task< LibraryCatalogSyncResult > DreamineWeb.Services.LibraryCatalogSyncService.SyncAsync ( )
inline

Sync Async 작업을 수행합니다.

반환값
Sync Async 작업에서 생성한 Task<LibraryCatalogSyncResult> 결과입니다.

LibraryCatalogSyncService.cs 파일의 113 번째 라인에서 정의되었습니다.

114 {
115 if (!IsConfigured) return new LibraryCatalogSyncResult(-1, 0, 0);
116
117 var projects = Directory.EnumerateFiles(_libRoot, "*.csproj", SearchOption.AllDirectories)
118 .Select(ReadProject)
119 .Where(p => p is not null)
120 .Cast<ProjectMetadata>()
121 .Where(p => !p.PackageId.EndsWith(".Tests", StringComparison.OrdinalIgnoreCase))
122 .OrderBy(p => CategoryRank(p.Category))
123 .ThenBy(p => p.PackageId, StringComparer.OrdinalIgnoreCase)
124 .ToList();
125
126 var libraries = await _store.GetAllAsync();
127 var byName = libraries.ToDictionary(x => x.Name, StringComparer.OrdinalIgnoreCase);
128 var nextSortByCategory = libraries
129 .GroupBy(x => string.IsNullOrWhiteSpace(x.Category) ? "Other" : x.Category)
130 .ToDictionary(g => g.Key, g => g.Max(x => x.SortOrder), StringComparer.OrdinalIgnoreCase);
131
132 var added = 0;
133 var updated = 0;
134
135 foreach (var project in projects)
136 {
137 var isNew = !byName.TryGetValue(project.PackageId, out var lib);
138 if (isNew)
139 {
140 var sortBase = nextSortByCategory.TryGetValue(project.Category, out var current)
141 ? current
142 : CategoryRank(project.Category) * 10;
143
144 lib = new LibraryInfo
145 {
146 Id = ToId(project.PackageId),
147 Name = project.PackageId,
148 Category = project.Category,
149 SortOrder = sortBase + 1,
150 IsVisible = true,
151 Status = "stable",
152 Version = "1.0.0"
153 };
154
155 nextSortByCategory[project.Category] = lib.SortOrder;
156 added++;
157 }
158
159 if (ApplyProjectMetadata(lib!, project) || isNew)
160 {
161 await _store.SaveAsync(lib!);
162 if (!isNew) updated++;
163 }
164
165 byName[project.PackageId] = lib!;
166 }
167
168 return new LibraryCatalogSyncResult(added, updated, projects.Count);
169 }
record LibraryCatalogSyncResult(int Added, int Updated, int ScannedProjects)

다음을 참조함 : _libRoot, _store, ApplyProjectMetadata(), CategoryRank(), IsConfigured, DreamineWeb.Services.LibraryCatalogSyncResult(), ProjectMetadata(), ReadProject(), DreamineWeb.Models.LibraryInfo.SortOrder, ToId().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ ToId()

string DreamineWeb.Services.LibraryCatalogSyncService.ToId ( string packageId)
inlinestaticprivate

To Id 작업을 수행합니다.

매개변수
packageIdpackage Id에 사용할 string 값입니다.
반환값
To Id 작업에서 생성한 string 결과입니다.

LibraryCatalogSyncService.cs 파일의 453 번째 라인에서 정의되었습니다.

454 {
455 var id = packageId.StartsWith("Dreamine.", StringComparison.OrdinalIgnoreCase)
456 ? packageId["Dreamine.".Length..]
457 : packageId;
458
459 return Regex.Replace(id.ToLowerInvariant(), @"[^a-z0-9]+", "-").Trim('-');
460 }

다음에 의해서 참조됨 : SyncAsync().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

멤버 데이터 문서화

◆ _libRoot

readonly string DreamineWeb.Services.LibraryCatalogSyncService._libRoot
private

lib Root 값을 보관합니다.

LibraryCatalogSyncService.cs 파일의 35 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : LibraryCatalogSyncService(), SyncAsync().

◆ _store

readonly ILibraryStore DreamineWeb.Services.LibraryCatalogSyncService._store
private

store 값을 보관합니다.

LibraryCatalogSyncService.cs 파일의 26 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : LibraryCatalogSyncService(), SyncAsync().

◆ _xmlDocRoot

readonly string DreamineWeb.Services.LibraryCatalogSyncService._xmlDocRoot
private

xml Doc Root 값을 보관합니다.

LibraryCatalogSyncService.cs 파일의 44 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : ApplyProjectMetadata(), LibraryCatalogSyncService().

◆ Whitespace

readonly Regex DreamineWeb.Services.LibraryCatalogSyncService.Whitespace = new(@"\s+", RegexOptions.Compiled)
staticprivate

Whitespace 값을 보관합니다.

LibraryCatalogSyncService.cs 파일의 54 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : Normalize().

속성 문서화

◆ IsConfigured

bool DreamineWeb.Services.LibraryCatalogSyncService.IsConfigured
get

Is Configured 값을 가져옵니다.

LibraryCatalogSyncService.cs 파일의 95 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : SyncAsync().


이 클래스에 대한 문서화 페이지는 다음의 파일로부터 생성되었습니다.: