2017-01-19 6 views
1

У меня есть требование, когда пользователь выбирает тип ReportType из раскрывающегося списка и загружает кнопку загрузки. Основываясь на выбранном типе, система должна сгенерировать отчет. Прямо сейчас у меня есть только тип отчета, который является QuoteReport. В будущем у меня будут другие типы отчетов, такие как PolicyReport, ClaimReport. Прямо сейчас я понятия не имею, какие будут поля данных в этих отчетах.Как создать общую структуру классов

public class QuoteReport 
{ 
    public String DeviceType { get; set; } 
    public String ProductName { get; set; } 
    public String Description { get; set; } 
    public String ID { get; set; } 
    public String Address { get; set; }  
} 

Теперь, что я делаю, я отправить ReportType и paramters заполнить отчет и я создал корпус переключателя, чтобы поймать тип отчета выбран.

public string PrepareReport(string selectedReport, List<int> Ids) 
{ 
    string response = string.Empty; 
    try 
    { 
     ReportTypeEnum reportTypeEnum; 
     if (Enum.TryParse(selectedReport, out reportTypeEnum)) 
     { 
      switch (reportTypeEnum) 
      { 
       case ReportTypeEnum.QuoteReport: 
        response = CreateReportData(Ids,response); 
        break; 
       default: 
        break; 
      } 
     } 
    } 
    catch (Exception exc) 
    { 
     handleException(DOWNLOAD_REPORT, exc); 
    } 
    return response; 
} 

Мой метод CreateReportData заполняет поля класса QuoteReport из wcf.

public string CreateReportData(List<int> Ids, string response) 
{ 
    List<QuoteReport> quoteReportList = new List<QuoteReport>();    
    foreach (var Id in Ids) 
    { 
     dynamic dynamicEntity; 
     List<string> devices = proxy.GetData(Id); 
     for (int i = 0; i < devices.Count; i++) 
     { 
      QuoteReport quoteReport = new QuoteReport(); 
      dynamicEntity = JObject.Parse(devices[i]); 
      quoteReport.Type = dynamicEntity.DeviceTypeString; 
      quoteReport.ProductName = dynamicEntity.ProductName; 
      quoteReport.Description = dynamicEntity.Desc; 
      quoteReport.ID = dynamicEntity.ID; 
      assetReport.Address = dynamicEntity.Address; 
      quoteReportList.Add(quoteReport); 

     } 
    } 
    response = JsonConvert.SerializeObject(quoteReportList); 
    return response; 
} 

Теперь я озадачен, как сделать код более универсальным. Или я могу использовать некоторые шаблоны проектирования, например Factory, чтобы сделать код адаптированным для будущих потребностей. Как я могу создать общий метод CreateReportData, чтобы он принимал любой тип класса и заполнял его свойства из службы.

+0

Вопрос слишком неопределен/широк для SO в текущем состоянии. Это может быть хорошей идеей ждать с рефакторингом, пока вы не узнаете свой вариант использования. Написание генерического кода для одного случая сложно и, вероятно, не полезно при введении других случаев. –

+0

@AlexeiLevenkov Должен ли я использовать любой шаблон проектирования для создания структуры – pankaj

+2

Не используйте переключатель - используйте «Словарь <Тип, Func >» (или что-то подобное), чтобы включить динамическое создание разных типов. Кроме того, никогда не используйте код 'catch (Exception exc)' - вы должны ** ** ** всегда ловить ошибки, которые вы можете специально восстановить. – Enigmativity

ответ

2

Я не собираюсь переписывать все (у вас есть проблемы со словом и разделение проблем с консьержем), но в общих чертах вы можете иметь интерфейс IReport, который имеет подпись Generate(List<int> Ids), а затем каждый тип отчета реализует это (и класс/сообщить сам решает, что делать с данными)

public class QuoteReport: IReport 
{ 
    public String DeviceType { get; set; } 
    public String ProductName { get; set; } 
    public String Description { get; set; } 
    public String ID { get; set; } 
    public String Address { get; set; } 

    public void Generate(List<int> ids) 
    { 
     // create "itself" 
    } 
} 

в зависимости от ваших общих случаев, вы решили, где провести разделение, и что получают передается Генерировать(). Это может быть список устройств, или ваш прокси + идентификаторы

Смежные вопросы