У нас есть система доставки контента, которая доставляет много разных типов контента на устройства.
Весь контент хранится в базе данных с contentID
& mediaTypeID
.
Для этого примера давайте предположим, что MediaType
может быть одним из этих 2, но на самом деле их гораздо больше.
Gif
MP3
Поскольку содержимое хранится в разных местах на основе медиатипа и требует отправки разных заголовков, существует большой неприятный фрагмент устаревшего кода, который по существу включает каждый медиатип и устанавливает правильные параметры. * Я хотел бы изменить это в более общую реализацию. Так вот, что у меня так далеко в моем каркасе
public interface IContentTypeDownloader
{
MemoryStream GetContentStream();
Dictionary<string, string> GetHeaderInfo();
}
public class GifDownloader : IContentTypeDownloader
{
public MemoryStream GetContentStream(int contentID)
{
//Retrieve Specific Content gif
}
public Dictionary<string, string> GetHeaderInfo()
{
//Retrieve Header Info Specific To gifs
}
}
public class MP3Downloader : IContentTypeDownloader
{
public MemoryStream GetContentStream(int contentID)
{
//Retrieve Specific Content mp3
}
public Dictionary<string, string> GetHeaderInfo()
{
//Retrieve Header Info Specific To mp3s
}
}
Что кажется разумным ... Пока я не доберусь до класса менеджера.
public class ContentManager<T> where T : IContentTypeDownloader
{
public int ContentID { get; set; }
public MemoryStream GetContent()
{
IContentTypeDownloader ictd = default(T);
return ictd.GetContentStream(this.ContentID);
}
... etc
}
Проблема в том, что мне все еще нужно инициализировать этот тип с помощью специального IContentTypeDownloader для этого mediaTypeID.
И я вернулся к квадрату 1, в ситуации, подобной
if(mediaTypeID == 1)
ContentManager<GifDownloader> cm = new ContentManager<GifDownloader>();
else if (mediaTypeID == 2)
ContentManager<MP3Downloader> cm = new ContentManager<MP3Downloader>();
и т.д ...
Любой, кто знает, как сделать это последнее решение общим, исходя из значения mediaTyepID
, которое выходит из базы данных