2010-05-04 3 views
1

바이너리 파일에 대한 참조를 반환해야하는 클래스 인터페이스를 작성하고 있습니다. 일반적으로 파일에 대한 참조를 파일 경로로 제공합니다. 그러나 일부 파일 (예 : 작은 축소판 그림)을 데이터베이스에 저장하는 대신 파일 시스템에 저장하는 것이 좋습니다. 이 경우 데이터베이스의 썸네일을 디스크로 읽어 들이고 파일에 경로를 반환하여 프로그램에서 읽을 수있는 추가 단계를 추가하고 싶지 않습니다. 사용자가 명시 적으로 무언가를 저장하고 싶지 않으면 디스크에 직접 이미지를 스트리밍하여 프로그램에 스트리밍하고 디스크에 아무 것도 쓰지 않는 것이 좋습니다.FileStream을 파일에 대한 일반 인터페이스로 반환 할 수 있습니까?

제 인터페이스가 FileStream 또는 Image을 돌려 주겠습니까? 그런 다음 FileStream 또는 Image의 소스가 데이터베이스의 디스크 또는 바이너리 파일에있는 파일인지 여부를 확인하는 것은 구현 클래스에 달려 있습니다. 그 크기가 매우 큰없는 경우

public interface MyInterface 
{ 
    string Thumbnail {get;} 
    string Attachment {get;} 
} 

public interface MyInterface 
{ 
    Image Thumbnail {get;} 
    FileStream Attachment {get;} 
} 

답변

1

사용법이 미리보기 이미지처럼 명확한 작은 콘텐츠의 경우 유형 (즉, 이미지)이 사용되면 반환하는 것이 좋습니다. 당신이 목적이 다를지도 모르는 큰 내용을 가지고 있거나 부분적으로 그것을 읽는 이유가 있다면 Stream 그들이가는 길입니다. 두 경우 모두 콘텐츠 원본은 클래스 사용자에게 표시되지 않습니다. 또한 스트림의 처리 방법을 고려하고 클래스 사용자가 데이터베이스 연결 기간을 제어 할 수 있는지 여부를 고려해야합니다.

+0

FileStream을 통한 스트림이 필요한 이유는 무엇입니까? –

+0

발신자로부터 콘텐츠 원본을 추상화합니다. 스트림이 파일이나 일종의 데이터베이스 blob과 같은 다른 소스 일 수있는 경우 특히 유용합니다. MemoryStream 일 수도 있습니다. 처음에 일종의 데이터베이스 blob 스트림으로 시작한 다음 전체 blob을 먼저 읽으려고 결정한 경우 호출자에게 아무런 영향을주지 않고 MemoryStream으로 전환 할 수 있습니다. 일반적으로 호출자가 어떤 유형의 스트림인지 알 필요가없는 한 항상 스트림을 사용합니다. (그리고 적어도 내 코드에서는 사실 인 경우를 기억할 수 없습니다.) – jdasilva

2

당신은 당신은 파일을 나타 내기 위해 byte[]를 사용할 수

1

파일이나 데이터베이스 중 하나에 스트리밍하는 Stream 객체를 반환 할 수 기억에 적합합니다. 그렇지 않으면 Stream이 좋지만 올바르게 해제하려면 IDisposable을 구현해야합니다.

+0

가장 큰 알려진 파일은 ~ 200kb입니다. 첨부 파일은 아무거나 될 수 있지만 최대 크기로 제한 할 수 있습니다. –

2

수 있습니다. 그러나 인터페이스를 다음과 같이 변경했습니다.

public interface MyInterface 
{ 
    Image CreateThumbnail(); 
    FileStream CreateAttachment(); 
} 

이렇게하면 반환 된 개체의 수명에 대한 모호성이 해결됩니다. 예를 들어 당신을 아래에서 처분하지 못하도록합니다.

관련 문제