필자는 다양한 데이터베이스/테이블의 엔터프라이즈 데이터를 레거시 응용 프로그램에서 사용하기 위해 특정 형식의 플랫 파일로 변환해야하는 유지 관리 응용 프로그램을 보유하고 있습니다.플랫 파일 변환을위한 데이터 모델 설계 ... 델리게이트 또는 상속?
public class StatusCode
{
public String Id { get; set; }
public Char Level { get; set; }
public String Description { get; set; }
}
데이터 원본에서 이러한 레코드의 일부 또는 전체를 선택합니다. 그리고 각 엔티티를 파일의 한 줄로 매핑해야하는데, 데이터를 조정해야 할 수도 있습니다 (패딩, 변환 또는 처리 null
).
public delegate String MapEntity<T>(T entity);
public MapEntity<StatusCode> MapStatusCode = delegate(StatusCode entity)
{
return String.Format("{0},{1},{2}",
entity.Id.PadLeft(3, '0'),
entity.Level == 'S' ? 0 : 1,
entity.Description ?? "-");
}
질문은 어떻게 변환 클래스를 작성합니까? 매핑 대리자를 사용하는 "DefaultFileCreator"를 제공합니까?
public interface IFileCreator
{
Byte[] Create<T>(MapEntity<T> map, IEnumerable<T> entities);
}
public class DefaultFileCreator : IFileCreator
{
public Byte[] Create<T>(MapEntity<T> map, IEnumerable<T> entities)
{
StringBuilder sb = new StringBuilder();
foreach (T entity in entities)
sb.AppendLine(map(entity));
return Encoding.Default.GetBytes(sb.ToString());
}
}
...
fileCreator.Create(MapStatusCode, repository<StatusCode>.FindAll());
...
이 솔루션을 사용하면 어디에서 어떤 범위에서 매핑 대리자를 유지해야하는지 걱정됩니다. 그리고 내가 어떻게해야하는지 알지 못하고 전화하는 방법은 T
입니다.
또는 인터페이스를 변경하고 구체적인 클래스에서 매핑을 요구합니까?
public interface IFileCreator<T>
{
Byte[] Create(IEnumerable<T> entities);
}
public abstract class FileCreator : IFileCreator<T>
{
protected abstract String Map(T entity);
public Byte[] Create(IEnumerable<T> entities)
{
StringBuilder sb = new StringBuilder();
foreach (T entity in entities)
sb.AppendLine(Map(entity));
return Encoding.Default.GetBytes(sb.ToString());
}
}
public class StatusCodeFile : FileCreator<StatusCode>
{
public override String Map(T entity)
{
return String.Format("{0},{1},{2}",
entity.Id.PadLeft(3, '0'),
entity.Level == 'S' ? 0 : 1,
entity.Description ?? "-");
}
}
이 솔루션은 구체적인 클래스로 폭발하지만 매핑 위임자만큼 얇습니다. 그리고 IFileCreator<T>
과 공장에서 일하는 것이 더 편합니다. (다시 필요할 경우에만).
나는 어떤 기본 클래스가 StringBuilder
루프와 Byte[]
인코딩으로 유용하다고 가정하고 있습니다. 구체적인 클래스가 (추상 메소드를 호출하는 대신) 기본 클래스에 델리게이트 속성을 설정해야합니까? 메서드에 type 매개 변수를 유지해야합니까 (기본/콘크리트 클래스에 어떤 영향을 미칩니 까?).
나는 어떤 해결책이있어. 나의 주요 목표는 유지 보수의 용이성이다. 나는 지금 12 모델/파일을 가지고 있으며 이것은 21까지 증가 할 수 있습니다. 임의의 머리말/꼬리말을 모든 파일에 삽입해야한다는 요구가있을 수 있습니다. (그래서 나는 overrideable 기본 클래스 메소드 인 Map을 좋아합니다.)
각 구체적인 클래스 MapEntity (대리자)에서 추상 속성을 재정의하는 것도 고려하고 있습니다. 메소드 Map (T)를 오버라이드 (override)하는 것과 같은 효과. 다른 모양. –