0

私たちのプロジェクトでは、依存関係を解決するために城のコンテナを使用しています。基本的に、さまざまなタスクを実行するための石鹸サービスを提供しています。

  public interface IServiceA
   {
      public ServiceResponse Process(ServiceRequest request);
   }

   public class ServiceA : IServiceA
   {
      public ServiceResponse Process(ServiceRequest request)
     {
         /////process stuff
     }
   }

    public interface IServiceB
   {
      public ServiceResponse ReProcess(ServiceRequest request);
   }

   public class ServiceB : IServiceB
   {
      private IServiceA _svcA;
      public ServiceB ()
      {
        _svcA= Container.Get<IServiceA>(); 
      }

     public ServiceResponse ReProcess(ServiceRequest request)
     {
        ////stuff
        _svcA.Process(new ServiceRequest()); 
     }
   }

svcA の process メソッドを再利用して、重複したコードを肥大化させないようにすることができますが、そのためには、その process メソッドを呼び出すときに、その呼び出しが svcB の Reprocess メソッド内からのものであることを svcA に伝える必要があります。何かのようなもの

public ServiceResponse Process(ServiceRequest request)\
{
   if (calledFromSvcB)
   {
    //do stuff
   }
   //process
}

制限は、serviceA によって提供されるメソッドの署名またはその型を意味するコントラクトを変更できないことです。

私が思いついた唯一のアイデアは次のとおりです。

 public class ServiceA : IServiceA
       {
         public bool IsCalledFromSvcB {get; set;} 
         public ServiceResponse Process(ServiceRequest request)
         {
             /////process stuff
         }
       }
 public class ServiceB : IServiceB
   {
      private IServiceA _svcA;
      public ServiceB ()
      {
        _svcA= Container.Get<IServiceA>(); 
      }

     public ServiceResponse ReProcess(ServiceRequest request)
     {
        _svcA.GetType().GetProperty("IsCalledFromSvcB ").SetValue(this, true);
        ////stuff
        _svcA.Process(new ServiceRequest()); 
     }
   }
which is really ugly. Any other ideas to inject this? 
4

1 に答える 1

1

複数のリクエストを同時に処理できる場合、内部サービスにプロパティまたはフィールドを設定しても機能しません。

2 番目のインターフェイスを使用することをお勧めします。何かのようなもの:

internal interface IServiceAInternal
{
    ServiceResponse ProcessFromServiceB(ServiceRequest request);
}

public class ServiceA : IServiceA, IServiceAInternal
{
    public ServiceResponse Process(ServiceRequest request)
    {
        return ProcessCore(request, false);
    }

    ServiceResponse IServiceAInternal.ProcessFromServiceB(ServiceRequest request)
    {
        return ProcessCore(request, true);
    }

    private ServiceResponse ProcessCore(ServiceRequest request, bool calledFromServiceB)
    {
        ...
    }
}

public class ServiceB : IServiceB
{
    private readonly IServiceAInternal _serviceA;

    public ServiceB()
    {
        _serviceA = Container.Get<IServiceAInternal>();
    }

    public ServiceResponse ReProcess(ServiceRequest request)
    {
        return _serviceA.ProcessFromServiceB(request);
    }
}
于 2013-02-12T18:38:08.573 に答える