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的過程方法,以沒有臃腫重複的代碼,但爲了這個,我需要告訴SVCA當我調用它的工藝方法,該呼叫來自svcB的再處理方法中,所以這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?
如果'ServiceA'需要知道它的調用是否來自'ServiceB'或不是,那麼它不是真正重複的代碼。如果代碼在ServiceB調用和非ServiceB調用之間有相當多的重疊,那麼您應該儘可能地重用。我會考慮重構你的代碼,或許是某種服務的幫助者。 – 2013-02-12 18:32:16
該代碼與svcB調用和非svcb調用之間的重疊90%,這就是爲什麼我選擇基本上從svcB內調用svcA;不知道你的意思與svc助手 – Elena 2013-02-12 18:35:11