The interface you defined is the contract you pass to your client which tells them what services you provide, in your case you provide a GetProduct
method.
Then, you create a concrete implementation of that contract, so when client code calls on your interface, they will end up invoking that concrete implementation, which will probably access some external resource (a database or a file) containing the product.
Your ProductClientProxy
, which inherits from ClientBase<IProductDetails>
is responsible for settings up the channel that will allow the client to make calls to your service. ClientBase is part of the WCF infrastructure, and is the class that actually reads the settings from your app.config
and is responsible for settings up communication.
I suggest you read more about ClientBase and even look at the source code