Geeks With Blogs
An educated guess (Timur Fanshteyn) Technology, Software Development and other ways to make an educated guess about the world...

My application is distributed via ClickOnce and a requirement is to be able to provide endpoint overrides for multiple environments. Here's what was done to create the solution

Smart Client Software Factory includes a service called EndpointCatalog. It allow for easy management of endpoints with environment overrides. Start by adding a Microsoft.Practices.SmartClient.EndpointCatalog.dll as a reference to Infrastructure.Module. Then open ModuleController class in and register the EndpointCatalog service.

private void AddServices()
IEndpointCatalog catalog = WorkItem.RootWorkItem.Services.Get<IEndpointCatalog>(false);
if (catalog == null)
IEndpointCatalogFactory catalogFactory =
new EndpointCatalogFactory("Endpoints");

catalog = catalogFactory.CreateCatalog();

This will read the endpoint catalog from the application.config file , section Endpoints. Here is a partial app.config

<section name="Endpoints" type="Microsoft.Practices.SmartClient.EndpointCatalog.Configuration.EndpointSection, Microsoft.Practices.SmartClient.EndpointCatalog" />

<add Name="DataService.DataClient"
UserName="default-user-name" Password="default-password" Domain="default-domain">
<add Name="QA" Address="http://qa.server/DataService.svc"/>
<add Name="UAT" Address="http://uat.server/DataService.svc"/>

The endpoints section defines an endpoint, and an override for each environment. The catalog will return the override if it exists, or the original entry if it does not.

To create the WCF client, I created the following function.

T CreateWCFClient<T, Ti>()
where T : ClientBase<Ti>, new()
where Ti : class
T client = new T();
if (endpointCatalog.EndpointExists(typeof(T).FullName))
client.Endpoint.Address = new EndpointAddress
(endpointCatalog.GetAddressForEndpoint(typeof(T).FullName, Environment));
return client;
catch (Exception)

Add the required service to the module that will hold the function and you are almost done. The request to create the client is as follows.

_DataWebService = CreateWCFClient<DataService.DataClient, DataService.IDataClient>();

Please comment for any questions, I'll try to clarify

Read original post on

Posted on Wednesday, December 5, 2007 2:27 PM | Back to top

Comments on this post: Creating a ClickOnce Smart Client CAB Based (SCSF) application with Environment Overrides

No comments posted yet.
Your comment:
 (will show your gravatar)

Copyright © Timur Fanshteyn | Powered by: