В нашем проекте мы используем контейнер замка для разрешения зависимостей. В основном мы предоставляем мыльные услуги для выполнения различных задач.задает значения свойств извне объекта
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?
Если 'ServiceA' должен знать, является ли его вызов« ServiceB »или нет, то это не совсем дублированный код. Если код перекрывает бит между вызовом ServiceB и вызовом non-ServiceB, вы должны попытаться использовать его как можно больше. Я бы подумал о реорганизации вашего кода, возможно, в качестве помощника службы. –
код перекрывается на 90% между вызовом из svcB и вызовом, отличным от svcb, поэтому я выбрал в основном вызов svcA из svcB; не уверен, что вы имеете в виду с помощником svc – Elena