I've got a Windows Service that makes use of a plugin system. I'm using the following code in the plugin base class to provide a separate configuration per DLL (so it'll read from plugin.dll.config):
string dllPath = Assembly.GetCallingAssembly().Location;
return ConfigurationManager.OpenExeConfiguration(dllPath);
These plugins need to make calls to WCF services, so the problem I'm running into is that new ChannelFactory<>("endPointName") only looks in the hosted application's App.config for the endpoint configuration.
Is there a way to simply tell the ChannelFactory to look in another configuration file or somehow inject my Configuration object?
The only way I can think of to approach this is to manually create an EndPoint and Binding object from values read in from plugin.dll.config and pass them to one of the ChannelFactory<> overloads. This really seems like recreating the wheel though, and it could get really messy with an endPoint that makes heavy use of behavior and binding configurations. Perhaps there's a way to create EndPoint and Binding objects easily by passing it a configuration section?
There are 2 options.
Option 1. Working with channels.
If you are working with channels directly, .NET 4.0 and .NET 4.5 has the ConfigurationChannelFactory. The example on MSDN looks like this:
As pointed out by Langdon, you can use the endpoint address from the configuration file by simply passing in null, like this:
This is discussed in the MSDN documentation.
Option 2. Working with proxies.
If you're working with code-generated proxies, you can read the config file and load a ServiceModelSectionGroup. There is a bit more work involved than simply using the
ConfigurationChannelFactorybut at least you can continue using the generated proxy (that under the hood uses aChannelFactoryand manages theIChannelFactoryfor you.Pablo Cibraro shows a nice example of this here: Getting WCF Bindings and Behaviors from any config source