2013-02-12 153 views
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? 
+0

如果'ServiceA'需要知道它的調用是否來自'ServiceB'或不是,那麼它不是真正重複的代碼。如果代碼在ServiceB調用和非ServiceB調用之間有相當多的重疊,那麼您應該儘可能地重用。我會考慮重構你的代碼,或許是某種服務的幫助者。 – 2013-02-12 18:32:16

+0

該代碼與svcB調用和非svcb調用之間的重疊90%,這就是爲什麼我選擇基本上從svcB內調用svcA;不知道你的意思與svc助手 – Elena 2013-02-12 18:35:11

回答

1

設置在內部服務屬性或字段,如果你可以有多個請求同時被處理將無法正常工作。

第二個接口可能是一個更好的主意。例如:

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); 
    } 
} 
+0

完美。謝謝 – Elena 2013-02-12 19:00:14