如何通过门面按需执行依赖注入?
问题描述:
我有一个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做到这一点的配置,但我留给想要类似“按需方法注入” ......
我想这可能是一个很好的候选人使用截取扩展,但我无法知道这是否真的是一个场景的作品 - 这是一个合理的路要走吗?
答
的解决方案看起来对我来说很简单,为什么不创建IReportService
和IExportService
,让统一注入的具体实施中的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;
}
}
+1,但为什么你仍然在做'新的ExportService'?这是构造器注入的一个很好的候选者。 – 2012-04-26 15:29:23