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 にこの構成をさせたいのですが、「オンデマンド メソッド インジェクション」のようなものが欲しいままです...

これは Interception 拡張機能を使用する良い候補かもしれないと考えていますが、これが本当にシナリオが機能するかどうかを知る方法はありません - これは合理的な方法ですか?

4

1 に答える 1

0

解決策は私には非常に単純に見えます。作成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;
    }      
}
于 2012-04-25T13:16:29.630 に答える