2012-04-24 81 views
0

我有一個Web服務門面這樣的:如何通過門面按需執行依賴注入?

interface MyWebServices 
{ 
    ReportsService.Conversion[] Conversions(); 
    ExportService.Advertiser[] ExportAdvertisers(); 
} 

public class MyWebServices : IMyWebServices 
{ 
    private string apiKey; 

    public CakeWebService(string apiKey) 
    { 
     this.apiKey = apiKey; 
    } 

    public ExportService.Advertiser[] ExportAdvertisers() 
    { 
     var service = new ExportService.export(); 
     int advertiserID = 0; 
     var advertisers = service.Advertisers(this.apiKey, advertiserID); 
     return advertisers; 
    } 

    public ReportsService.Conversion[] Conversions() 
    { 
     var target = new ReportsService.reports(); 
     DateTime from = new DateTime(2012, 1, 1); 
     DateTime to = DateTime.Now.AddDays(1); 
     int affiliateID = 0; 
     int offerID = 0; 
     var conversions = target.ConversionExport(this.apiKey, from, to, affiliateID, offerID, false); 
     return conversions; 
    } 
} 

每個方法創建一個Web服務的一個實例,然後調用之前對其進行配置。

我寧願我的UnityContainer做到這一點的配置,但我留給想要類似「按需方法注入」 ......

我想這可能是一個很好的候選人使用截取擴展,但我無法知道這是否真的是一個場景的作品 - 這是一個合理的路要走嗎?

回答

0

的解決方案看起來對我來說很簡單,爲什麼不創建IReportServiceIExportService,讓統一注入的具體實施中的service,然後稍微重構你的類,看起來像這樣:

public interface IExportService 
{ 
    ExportService.Advertiser[] ExportAdvertisers(); 
} 

public class ConcreteExportService : IExportService 
{ 
    public ExportService.Advertiser[] ExportAdvertisers() 
    { 
     var service = new ExportService.export(); 
     int advertiserID = 0; 
     var advertisers = service.Advertisers(this.apiKey, advertiserID); 
     return advertisers; 
    } 
} 

public interface IReportService 
{ 
    ReportsService.Conversion[] Conversions(); 
} 

public class ConcreteReportService : IReportService 
{ 
    public ReportsService.Conversion[] Conversions() 
    { 
     var target = new ReportsService.reports(); 
     DateTime from = new DateTime(2012, 1, 1); 
     DateTime to = DateTime.Now.AddDays(1); 
     int affiliateID = 0; 
     int offerID = 0; 
     var conversions = target.ConversionExport(this.apiKey, from, to, affiliateID, offerID, false); 
     return conversions; 
    } 
} 

public class MyWebServices : IMyWebServices 
{ 
    private string apiKey; 
    private IExportService _exportService; 
    private IReportService _reportService; 

    public MyWebServices(
     IExportService exportService, 
     IReportService reportService) 
    { 
     this._exportService = exportService; 
     this._reportService = reportService; 
    } 

    public ExportService.Advertiser[] ExportAdvertisers() 
    { 
     return this._exportService.ExportAdvertisers(); 
    } 

    public ReportsService.Conversion[] Conversions() 
    { 
     return this._reportService.Conversions(); 
    } 

    public CakeWebService(string apiKey) 
    { 
     this.apiKey = apiKey; 
    }  
} 
+0

+1,但爲什麼你仍然在做'新的ExportService'?這是構造器注入的一個很好的候選者。 – 2012-04-26 15:29:23