Working with Custom Providers
page 2 of 8
by Brian Mains
Average Rating: 
Views (Total / Last 10 Days): 53824/ 118

Part 1: Provider Abstract Class

The cornerstone to this approach is an abstract class that all derived, implementation-specific providers will inherit.  Although not every method in the class is abstract, the methods that are the most important for the operation are abstract and will be overridden in the derived class.  If you look through the abstract methods, they deal with the adding, deleting, updating, and retrieving, and checking the existence of newsletters and subscribers.

Listing 1

public abstract class NewsletterProvider : Nucleo.Web.Providers.ProviderBase
      public abstract void AddNewsletter(string newsletterName, 
       string description);
      public abstract void AddSubscription(string subscriberEmail, 
       string newsletterName);
      public abstract string[] FindSubscriber(string emailToMatch, 
       string newsletterName);
      public abstract string[] GetAllNewsletters();
      public abstract string[] GetNewslettersForSubscriber(
       string subscriberEmail);
      public abstract string[] GetSubscribers(string newsletterName);
      public abstract bool NewsletterExists(string newsletterName);
      public abstract void RemoveNewsletter(string newsletterName);
      public abstract void RemoveAllSubscriptions(string subscriberEmail);
      public abstract void RemoveSubscription(string subscriberEmail, 
       string newsletterName);
      public abstract bool SubscriberExists(string subscriberEmail);
      public abstract bool SubscriptionExists(string subscriberEmail, 
       string newsletterName);


      protected virtual void ValidateNewsletterName(string newsletterName)
            if (string.IsNullOrEmpty(newsletterName))
                  throw new ArgumentNullException("newsletterName", 
                         "The newsletter name must be provided.");
      protected virtual void ValidateSubscriberEmail(string subscriberEmail)
            if (string.IsNullOrEmpty(subscriberEmail))
                  throw new ArgumentNullException("subscriberEmail",
                        "The subscriber email must be provided.");

The validation is stored in the abstract class and used directly, because it will be handled the same way in all derivatives.  If for some reason it isn't, these methods declare virtual in the definition, so they can be overridden.

By inheriting from this abstract class, any derived class can be used directly through this class.  This is the benefit of inheritance:  all derived classes coming from the same base class can be referenced as the base class.  So in this instance, any derivatives of the NewsletterProvider class can be referenced as NewsletterProvider, which is an important part of object-oriented programming as you will see soon.

View Entire Article

User Comments

Title: Source Code   
Name: Satish Nandigam
Date: 2010-10-27 2:43:31 AM
Hi This is a nice article . Can please provide the source code for custom Provider for the Newsletter.
Title: Thanks   
Name: Anitha T S
Date: 2010-07-26 7:31:51 AM
Thank you very much for your article on providers. Your article is easy to read and understand! I am a better because of it. ;)
Title: Question Reply   
Name: Brian Mains
Date: 2009-10-16 2:53:52 PM

Yes, DefaultProvider doesn't exist within ConfigurationSection; it exists in my custom base class, which I should have posted, but I didn't. My apologies.

In your custom section class, just add:

public string DefaultProvider
get { return (string)this["defaultProvider"]; }

ConfigurationProperty("providers", IsDefaultCollection=false),
public ProviderSettingsCollection Providers
get { return (ProviderSettingsCollection)this["providers"]; }

That's what exists in my base class, as a helper. You can also download the project at:, which has these files in Nucleo.dll, in the Nucleo.Providers namespace. I will be posting an update to this project soon with updated AJAX controls, but this code hasn't been touched so it will remain the same, if you are interested.
Title: Question   
Name: Mark Toth
Date: 2009-10-16 2:08:41 PM
When I derive a class from ConfigurationSection I get the following error for DefaultProvider "no suitable method found to override". Am I missing something?
Title: Thanks   
Name: Mahr G. Mohyuddin
Date: 2009-04-22 9:21:56 AM
Well explained, Brian!. Thanks.
Title: Many Thanks   
Name: Linda
Date: 2009-02-11 9:58:01 AM
Thank you very much for your article on providers. Your article is easy to read and understand! I am a better because of it. ;)
Title: still confused reply   
Name: Brian
Date: 2008-08-28 8:50:50 AM
The static class is a class separate from the rest of the code, which exposes the provider base class to the public. It's responsible for instantiating it.

SO this is something that should be in the same project as the provider, but is a separate class.
Title: still confused :(   
Name: .
Date: 2008-08-28 3:19:45 AM
Would have been nice to be able to download code. I'm at a loss as to where to put the static class - whether I put it in the application which is trying to use the providers, or in the provider code itself as a separate class.
Title: good articles   
Date: 2007-09-05 9:16:47 PM
very good articles
Title: Good   
Name: Bilal Wani
Date: 2007-03-20 7:17:27 AM
Nice Article!!!
Title: Patil   
Name: Sandip
Date: 2007-03-15 5:16:26 PM
Nice Article!!!

-Sandip Patil
Title: Good   
Name: Ramamuni Reddy
Date: 2007-02-18 11:25:54 PM
Hello Brian Mains,
Very Good Article.

With Regrads
Ramamuni reddy Mulapaku
Title: Provider Utility   
Name: Bilal Hadiar [MVP]
Date: 2007-02-06 6:07:46 AM
Hello Brian,
It is a well written article, congratulations!

I would like to refer you and all the readers to a utility I created a while ago that helps you generate the skeleton of a provider files in a single button click,
Check it here:

Title: Mr.   
Name: KotiReddy.
Date: 2007-02-06 12:30:15 AM
Very Good Article.

Koti Reddy. S

Community Advice: ASP | SQL | XML | Regular Expressions | Windows

©Copyright 1998-2021  |  Page Processed at 2021-12-08 1:36:12 PM  AspAlliance Recent Articles RSS Feed
About ASPAlliance | Newsgroups | Advertise | Authors | Email Lists | Feedback | Link To Us | Privacy | Search