我需要一个可以从我的客户端项目中调用的服务。要求是我可以更改和发布服务,但在更改服务后,不需要重建客户端。例如,假设我有服务帮助人们到达目的地
[ServiceContract]
IDestinationHelper
{
[OperationContract]
void ReachDestination(string person);
}
class ReachedByTrain:IDetinationHelper
{
void ReachDestination(string person)
{
//Help the person to reach destination
}
}
现在该服务正在帮助该人通过火车到达目的地,在这种情况下,我将从客户端调用ReachedByTrain服务,但假设有一个要求,我希望该人通过Flight到达,在这种情况下应该如何我继续进行而不改变或建立客户端。功能应该是可插入的,客户端应该自动检测它
class ReachedByFlight:IDetinationHelper
{
void ReachDestination(string person)
{
//Help the person to reach destination
}
}
请提供有关如何完成的任何帮助或参考。
P.S一次只能向客户提供一种模式。无论客户是否了解它。
答案 0 :(得分:1)
您有多种方法可以实现可扩展性。
界面已在您的客户端中修复。构建处理变化接口的代码很难并且容易出错。不要那样做。
因此,您需要保持接口完好无损并更改班级的内部行为。
在您的示例中,您的服务可以返回一个点列表作为到目标的路径以及一个记录传输模式的字符串。现在,您可以包含所有类型的运输模式并为其返回路线,而无需更改界面。
当您添加新的可能的传输模式时,必须通知客户端,以便可以将其呈现给用户,例如在ComboBox中。这意味着您需要在界面中使用一种方法来返回所有可能的运输模式。这样,您的客户端可以处理新的客户端而无需重新编译。它甚至可以在您删除模式时处理它。
这样您的客户就有合同,合同永远不会改变。但是,在重建和重新部署服务时,您的方法可以返回不同的内容。
示例:
此合约永远不会改变:
[ServiceContract]
IDestinationHelper
{
[OperationContract]
IEnumerable<Waypoint> ReachDestination(string transportationMode);
[OperationContract]
IEnumerable<string> GetAvailabletransportationModes();
}
IDestinationHelperService : IDestinationHelper
{
public IEnumerable<Waypoint> ReachDestination(string transportationMode)
{
// decide return value by transportation mode. Use a switch statement, dependency injection, IoC containers, whatever you want
}
public IEnumerable<string> GetAvailabletransportationModes()
{
// decide return value by getting all modes from wherever you decided upon above.
}
}
答案 1 :(得分:0)
我认为你需要一个带有[OperationContract]的[ServiceContract],它需要&#34; ModeOfTransport&#34;作为参数并具有路由逻辑来创建ReachByTrain或ReachByPlane或ReachByAnything的对象,并将从[OperationContract]中调用它。从客户端,您可以调用[OperationContract],其中包含具有适当参数的路由逻辑。