[英]How to do dependency injection on demand with a facade?
我有一個這樣的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進行此配置,但我仍然想要“ 按需方法注入 ”之類的東西。
我認為這可能是使用Interception擴展的不錯選擇,但是我無法知道這是否真的可行-這是一種合理的方法嗎?
該解決方案對我來說看起來非常簡單,為什么不創建IReportService
和IExportService
並統一地將具體實現注入到服務中,然后稍微重構類以使其看起來像這樣:
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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.