2011-09-24 12 views
7

İstemciden geçirilen String parametresine dayalı bir bakla enjekte etmek istiyorum.Çekirdek koşullu enjeksiyon fasulye

public interface Report { 
    generateFile(); 
} 

public class ExcelReport extends Report { 
    //implementation for generateFile 
} 

public class CSVReport extends Report { 
    //implementation for generateFile 
} 

class MyController{ 
    Report report; 
    public HttpResponse getReport() { 
    } 
} 

İletilen parametreye göre rapor örneğinin enjekte edilmesini istiyorum. Herhangi bir yardım büyük ölçüde hazırlanabilir. Şimdiden teşekkürler

cevap

13

Kullanım Factory method kalıbı:

public enum ReportType {EXCEL, CSV}; 

@Service 
public class ReportFactory { 

    @Resource 
    private ExcelReport excelReport; 

    @Resource 
    private CSVReport csvReport 

    public Report forType(ReportType type) { 
     switch(type) { 
      case EXCEL: return excelReport; 
      case CSV: return csvReport; 
      default: 
       throw new IllegalArgumentException(type); 
     } 
    } 
} 

Eğer ?type=CSV ile kontrolör çağırdığınızda tip enum Bahar oluşturulabilir raporu:

class MyController{ 

    @Resource 
    private ReportFactory reportFactory; 

    public HttpResponse getReport(@RequestParam("type") ReportType type){ 
     reportFactory.forType(type); 
    } 

} 

Ancak ReportFactory oldukça hantal ve değişiklik yapılmasını gerektirir her yeni rapor türünü eklediğinizde. Eğer rapor türleri listelenirse düzeltilmiş demektir.

public interface Report { 
    void generateFile(); 
    boolean supports(ReportType type); 
} 

public class ExcelReport extends Report { 
    publiv boolean support(ReportType type) { 
     return type == ReportType.EXCEL; 
    } 
    //... 
} 

@Service 
public class ReportFactory { 

    @Resource 
    private List<Report> reports; 

    public Report forType(ReportType type) { 
     for(Report report: reports) { 
      if(report.supports(type)) { 
       return report; 
      } 
     } 
     throw new IllegalArgumentException("Unsupported type: " + type); 
    } 
} 

yeni rapor türünü ekleyerek Bu uygulamayla Report ve yeni bir ReportType enum değeri uygulayan yeni fasulye eklemek kadar basit olduğunu: Daha fazla ve daha fazla türde eklemeyi planlıyoruz Ama eğer, bu daha sağlam bir uygulamasıdır. enum olmadan ve dizeleri (belki de fasulye isimleri) kullanmadan uzaklaşabilirdiniz, ancak güçlü yazmayı faydalı buldum.


Son düşünce: Report adı biraz talihsiz bir durumdur. Report sınıfı, (mantıksız?) Bazı mantığın (Strategy modeli) kapsüllemesini temsil ederken, adın değerini (veri) kapsandığını öne sürer. ReportGenerator ya da benzerlerini öneriyorum.

+0

Çok teşekkürler Tomasz ... bunu deneyecek. İsmini buna göre değiştireceğim. –

+0

Bir çekicilik gibi çalıştım ... Ölçeklendirilebilir seçeneği göstermek için –

+0

+1 çok teşekkür ederiz – DecafCoder