我有一个返回基类响应的服务。可以肯定的是,它得到了响应。
public class ResponseBase
{
public string Response { get; set; }
}
public class DerivedResponse : ResponseBase
{
public string AdditionalResponse { get; set; }
}
这里是服务代码:
public class SomeService
{
public ResponseBase GetResponse() => new DerivedResponse();
}
然后,我需要以不同的方式处理不同的响应。显然,如果不是一个好的解决方案,请尝试通过100500获得适当的行为。而且,我决定为每个具体响应设置一个特殊的响应处理程序。
public interface IHandlerBase<T>
where T : ResponseBase
{
void Handle(T response);
}
public class DerivedResponseHandler : IHandlerBase<DerivedResponse>
{
public void Handle(DerivedResponse response)
{
}
}
此外,我们需要封装行为,该行为将决定要获取哪个处理程序以处理具体响应,我认为工厂的解决方案不是一个坏办法。我有一个问题,因为我不知道返回什么,因为我不知道编译时派生的类型:
public class HandlerFactory {
public IHandlerBase<> /*WHAT RETURN HERE*/ CreateHandler(ResponseBase response)
{
//decide the derived type of the 'response' and return appropriate handler
}
}
确保我们可以删除通用参数,在所有处理程序中接受基类,然后在具体处理程序中将其转换为special,但我认为这不是一个好的解决方案。因此,您能否建议如何以一种干净的方式(可能是某些模式或解决方案)来做到这一点?
我们可以通过创建新的NotGeneric interface
:
public interface IHandlerBase
{
void Handle(ResponseBase response);
}
public interface IHandlerBase<T> : IHandlerBase
where T : ResponseBase
{
void Handle(T response);
}
public class DerivedResponseHandler : IHandlerBase<DerivedResponse>
{
public void Handle(DerivedResponse response)
{
}
public void Handle(ResponseBase response)
{
var actualParameter = (DerivedResponse) response;
Handle(actualParameter);
}
}
在那种情况下,派生处理程序中有2种方法:一种用于实际处理,另一种用于自适应(类似于适配器模式)。问题是还可以,也许有人有更好的解决方案。