簡體   English   中英

如何使用立面按需進行依賴項注入?

[英]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擴展的不錯選擇,但是我無法知道這是否真的可行-這是一種合理的方法嗎?

該解決方案對我來說看起來非常簡單,為什么不創建IReportServiceIExportService並統一地將具體實現注入到服務中,然后稍微重構類以使其看起來像這樣:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM