Ideally when you have a bunch of options (to execute an operation) , and want a loose coupling on how exactly to execute, this would be good pattern.
So in a configuration file you want to dynamically have 1) your options 2) Load current choice of execution. One class keeps the collection and default strategy. Provider class may alredy has a filewatcher alert on the configuration file.
2012-08-16 02:08
I have two ways of travelling
public abstract class ITravelProvidor : ProviderBase { public abstract void goSomewhere2(string dest); } public class GoByCar : ITravelProvidor { private string mystring = "By car "; public override void goSomewhere2(string dest) { string h = mystring; } } public class GoByCab : ITravelProvidor { private string mystring = "By cab "; public override void goSomewhere2(string dest) { string h = mystring; } }
2012-08-16 02:34
Now a manager
// Know current choice and all choices // Notice the static constructor -- reload whenever confoig file changes public class ChoiceManager { private static ITravelProvidor defaultChoice; private static ChoiceCollection providers; static ChoiceManager() { Initialize(); }
private static void Initialize() { //Load ChoiceCollection From config file //set default one from config file } }
// Just a collection class public class ChoiceCollection : ProviderCollection { new public ITravelProvidor this[string name] { get { return (ITravelProvidor)base[name]; } } } v
2012-08-16 02:36
now add a class that can load and store stuff from config file
public class TravelProviderConfiguration : ConfigurationSection { [ConfigurationProperty("choices")] public ProviderSettingsCollection Providers { get { return (ProviderSettingsCollection)base["choices"]; } }
[ConfigurationProperty("default", DefaultValue = "car")] public string Default { get { return (string)base["default"]; } set { base["default"] = value; } } }
Two Questions
Wholoads It? where from we load it.
modify ChoiceManagesr's Initialize implementation
private static void Initialize() { //Load ChoiceCollection From config file TravelProviderConfiguration configuration = (TravelProviderConfiguration)ConfigurationManager.GetSection("TravelProvider"); providers = new ChoiceCollection(); ProvidersHelper.InstantiateProviders(configuration.Providers, providers, typeof(ITravelProvidor)); providers.SetReadOnly(); //set default one from config file defaultChoice = providers[configuration.Default]; }
Ideally when you have a bunch of options (to execute an operation) , and want a loose coupling on how exactly to execute, this would be good pattern.
So in a configuration file you want to dynamically have 1) your options 2) Load current choice of execution. One class keeps the collection and default strategy. Provider class may alredy has a filewatcher alert on the configuration file.
I have two ways of travelling
public abstract class ITravelProvidor : ProviderBase
{
public abstract void goSomewhere2(string dest);
}
public class GoByCar : ITravelProvidor
{
private string mystring = "By car ";
public override void goSomewhere2(string dest)
{
string h = mystring;
}
}
public class GoByCab : ITravelProvidor
{
private string mystring = "By cab ";
public override void goSomewhere2(string dest)
{
string h = mystring;
}
}
Now a manager
// Know current choice and all choices
// Notice the static constructor -- reload whenever confoig file changes
public class ChoiceManager
{
private static ITravelProvidor defaultChoice;
private static ChoiceCollection providers;
static ChoiceManager()
{
Initialize();
}
private static void Initialize()
{
//Load ChoiceCollection From config file
//set default one from config file
}
}
// Just a collection class
public class ChoiceCollection : ProviderCollection
{
new public ITravelProvidor this[string name]
{
get { return (ITravelProvidor)base[name]; }
}
}
v
now add a class that can load and store stuff from config file
public class TravelProviderConfiguration : ConfigurationSection
{
[ConfigurationProperty("choices")]
public ProviderSettingsCollection Providers
{
get
{
return (ProviderSettingsCollection)base["choices"];
}
}
[ConfigurationProperty("default", DefaultValue = "car")]
public string Default
{
get
{
return (string)base["default"];
}
set
{
base["default"] = value;
}
}
}
Two Questions
Wholoads It? where from we load it.
modify ChoiceManagesr's Initialize implementation
private static void Initialize()
{
//Load ChoiceCollection From config file
TravelProviderConfiguration configuration = (TravelProviderConfiguration)ConfigurationManager.GetSection("TravelProvider");
providers = new ChoiceCollection();
ProvidersHelper.InstantiateProviders(configuration.Providers, providers, typeof(ITravelProvidor));
providers.SetReadOnly();
//set default one from config file
defaultChoice = providers[configuration.Default];
}
Have the following configuration
<TravelProvider default="car">
<providers>
<add name="car" type="SampleProvider.GoByCar, SampleProvider" connectionString="abcd"/>
<add name="bike" type="SampleProvider.GoByBike, SampleProvider" connectionString="bcde"/>
<add name="cab" type="SampleProvider.GoByCab, SampleProvider" connectionString="cdef"/>
</providers>
</TravelProvider>