1
0
Fork 0

refactor(P3): combine을 IMultiInputConverter로 추출 — 엔진 ImageMagick 누수 봉합

ConversionEngine이 더 이상 ImageMagick에 의존하지 않는다(추상화 누수 확정 봉합).
결합(N→1)을 변환 그래프의 1입력 엣지로 표현 못 하던 한계를 1급 인터페이스로 분리(Branch by Abstraction).

- Core/Providers/IMultiInputConverter.cs 신규 — CanCombineTo + CombineAsync(N→1).
- MagickProvider가 IMultiInputConverter 구현 — 엔진의 CombineAsync/LoadImageForCombine/
  ApplyCombineEncoding 코드를 동작 그대로 이주(CombinableOutputs도 이관).
- ConversionEngine: using ImageMagick 제거(코드 참조 0건, grep 검증 — 주석만 잔존),
  CombineAsync는 _registry.All.OfType<IMultiInputConverter>()로 결합기를 찾아 위임하는 얇은 코드로 축소.
  출력 디렉터리 결정만 엔진이 수행, 파일명·인코딩·쓰기는 결합기가 담당.
- UI 무변경: 정적 CanCombine/CanCombineInput(순수 메타데이터, ImageMagick 무관)은 엔진에 그대로 유지.
- 신규 테스트: MagickProvider가 IMultiInputConverter로 발견되는 seam 잠금.

P1 combine 골든마스터(프레임수·NoCompression·치수·평균색 + PDF 헤더)가 추출 후에도 그린 = 동작 동일성 입증.
70개 테스트 전부 그린, 빌드 0경고/0오류.
This commit is contained in:
Yun Chan 2026-06-01 23:39:02 +09:00
parent 8419bf30ff
commit dad1c0bca3
4 changed files with 154 additions and 72 deletions

View file

@ -59,6 +59,20 @@ public class DependencyInjectionTests
Assert.Same(settings, sp.GetRequiredService<ISettingsStore>());
}
[Fact]
public void MagickProvider_IsDiscoverableAsMultiInputCombiner()
{
// P3: 엔진은 결합을 _registry.All.OfType<IMultiInputConverter>()로 찾는다.
// 이 seam이 깨지면(MagickProvider가 인터페이스 미구현/Scrutor 미등록) 결합이 전부 실패한다.
var reg = Everything2EverythingBootstrap.CreateDefault().Providers;
var combiners = reg.All.OfType<IMultiInputConverter>().ToList();
Assert.NotEmpty(combiners);
Assert.Contains(combiners, c => c.CanCombineTo(".pdf"));
Assert.Contains(combiners, c => c.CanCombineTo(".tif"));
Assert.Contains(combiners, c => c.CanCombineTo(".gif"));
Assert.DoesNotContain(combiners, c => c.CanCombineTo(".png")); // png은 결합 출력이 아님
}
[Fact]
public void CreateDefault_Facade_StillWorks()
{