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