2012-04-24 80 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