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