Public · Protected · Private
The Provider Model
Type: Public  |  Created: 2012-08-16  |  Frozen: Yes
« Previous Public Blog Next Public Blog »
Comments
  • 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];
    }

    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>

    2012-08-16 02:49
This blog is frozen. No new comments or edits allowed.