Geeks With Blogs

@tfanshteyn
  • tfanshteyn Awesome: tracert 216.81.59.173 about 98 days ago
  • tfanshteyn RT @AdviceMallards When searching plane tickets online, delete your cookies. Prices go up if you visit a site multiple times. about 102 days ago
  • tfanshteyn RT @unhealthytruth Junk food costs about $1.76 per 1,000 calories versus $18.16 per 1,000 calories for nutritious foods about 126 days ago
  • tfanshteyn RT @NYCSchools Just announced: School days lost due to #Sandy will be made up February 20-22 and June 4. about 181 days ago

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();
WorkItem.RootWorkItem.Services.Add<IEndpointCatalog>(catalog);
}

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

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

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

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
{
try
{
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)
{
throw;
}
}

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 http://blog.tfanshteyn.com/2007/11/creating-clickonce-smart-client-cab.html

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: GeeksWithBlogs.net | Join free