asp.netarchitecturewcfserviceclient

WCF service architecture query


I have an application that consists of a web application, and mutliple windows services, only one windows service is installed depending on what version of the backend sofware is used.

Currently, Data is saved by the web app in a database, then the relevant service is installed and this picks up the data and posts it in to the backend system that is installed.

I want to change this to use WCF services so the resulting data is returned directly to the web app.

I have not used WCF services before but Im assuming I can do something like this.

WebApp.Objects.Dll - contains Database objects, eg PurchaseOrder object

WebApp.Service.Contracts.dll - here I can describe the service methods, this will reference the WebApp.Objects.dll so I can take a PurchaseOrder object as a parameter

WebApp.Service.2011.dll - This will be the actual service for the 2011 version of the backend system, this will reference the WebApp.Service.Contracts dll

WebApp.Service.2012.dll - This will be the actual service for the 2012 version of the backend system, this will reference the WebApp.Service.Contracts dll

So, my question is, does the web app need to know the specifics about what backend WCF service is used? I just want to call a service with the specified Interface and not care about how its implemented or what it does internally, but just to return the purchase order that was created in the backend system (whether it return an interface or a concrete class)

Will i be able to create a service client without needing to know whether its the 2011, or 2012 WCF service being used?


Solution

  • As long as you are able to use the exact same contract for all the versions the web application does not need to know which version of the WCF service it is accessing.

    In the configuration of the web application, you specify the URL and the contract. However, besides the contract there might be other differences between the services. In an extreme example this might mean that v2011 uses a different binding as v2012 of the backend - which is not very likely from your description. But also subtle differences in the configuration or the behavior of the services should be addressed in the configuration files. E.g. if v2012 needs longer for an action as v2011 does, the timeouts need to be configured so that the longer time of v2012 does not lead to an expiration.