2013-02-12 4 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, когда я называю его метод обработки, что вызов внутри метода Reprocess 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 и вызовом non-ServiceB, вы должны попытаться использовать его как можно больше. Я бы подумал о реорганизации вашего кода, возможно, в качестве помощника службы. –

+0

код перекрывается на 90% между вызовом из svcB и вызовом, отличным от svcb, поэтому я выбрал в основном вызов svcA из svcB; не уверен, что вы имеете в виду с помощником svc – Elena

ответ

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

Смежные вопросы