2013-02-12 150 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