Nothing but .net

Validation and the Enterprise Library

 

For some of my latest projects, I have been using Enterprise Library for the Data Access Layer (combined with other technologies).
In this tutorial, I will explain the Validation Application Block, a complete new application block included in version 3 of the library. I’ll create some samples on how you can use the Validation block and I’ll also create a custom validator.

Installation of the enterprise library V3.0

As you probably guessed, to start using the EntLib V3.0, you should install the files. You can get the CTP from the all-new CodePlex.com site, entirely devoted to Enterprise Library. You should of course have Visual Studio 2005 installed on your PC. If you want to use the Guidance Packages, you’ll also need the Guidance Automation Extensions. You can read any further requirements in the Readme included in the download.
When installed, you can find the library under Microsoft Patterns and Practices. As you can see, one of the items there is the Enterprise Library Source Code Installer. You can use this to create more than one “working copies” of the code included in the EntLib. Run this, you’ll be needing this if you want to follow along with this tutorial. I extracted the files to “C:\EntLib3Src”.
In the folder, go to App Blocks à Src à Validation and open the project file you find here (Validation.csproj). To finish the installation, build the project. You’ll now have the DLLs needed to use the Validation Application Block.

OK, but what is this Validation block then?

Before I begin with the explanation on how to use the Validation Block, let me first introduce you to what it actually does and where it can be used.

From Tom Hollander’s Blog:
The Validation Application Block will include a comprehensive library of common validation rules that apply to primitive data types. For example, we'll include rules like string length, numeric range, date range, regular expressions and so on. However your applications will typically deal with more complex objects such as Customers or Orders (yes, here at Microsoft we assume every application is based on Northwind ;-), so while the built-in Validators should be great building blocks, you'll need to do some additional work to specify how these primitive rules apply to more complex objects. We plan on letting you do this in two primary ways: in configuration (which is ideal if you want the rules to be easily changed after deployment), or in code (which allows better encapsulation of rules and ensures the behavior won't change unless the code does).

You can do validation using configuration, or you can do it in code. In this tutorial, I’ll be focusing on the code-approach using attributes, mainly because there is no support yet in the “Enterprise Library Configuration-tool” for this at this moment.

Included in the library are a number of often needed validations: “not null”, string length, null… You can take a look at the included validators in the project you built earlier under Validation à Validators. In the final release, more will be added. In the first part of this tutorial, I’ll be using some of these to show you how it works.
Of course, this collection will never be enough for full-scale enterprise applications, so you have the possibility to write your own validators, as I’ll show later in this tutorial.

I’m convinced about the VAB! How can I use it?

OK, now that you know what the block is about, let’s start using it. As said, in this first part of my tutorial, I’ll use some of the included validators.

Create a new project in Visual Studio (I used a Winforms project and named it TestValidationApplicationBlock). While you’re at it, add a class library to the solution (for example: BLCustomers). This will be used as Business Layer in the sample application, and the objects in this layer will need to be validated using the Validation Application Block.

In the class library, add a new class, Customer for example. Add 2 properties, name and email for example (you can of course take whatever you want).

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;
using Microsoft.Practices.EnterpriseLibrary.Validation;
using MyCustomValidators;

namespace BLCustomers
{
    public class Customer
    {
        private string name;
        private string email;

        public Customer() { }

        public Customer(string name, string email)
        {
            this.name = name;
            this.email = email;
        }

        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        public string Email
        {
            get { return email; }
            set { email = value; }
        }
   }
}

To enable validation on this class, we first need to reference the necessary DLLs in this project. Right-click the “class library project” and select “Add reference”. Browse to where you built the enterprise library validation project, and in the bin folder, you’ll find 3 DLLs (Microsoft.Practices.EnterpriseLibrary.Common.dll, Microsoft.Practices.EnterpriseLibrary.Validation.dll and Microsoft.Practices.ObjectBuilder.dll). Reference these, and also create a reference to System.Configuration (which you’ll find under the .net tab).

Now, we want to add some validation on the name and email properties of the Customer class. As said, we’ll use attributes on the properties. For example, we want the name to be a string with a length greater than 0, and we want both the email and the name to be not null.

For this, we add the NotNullValidator and StringLengthValidator as attributes. The StringLengthValidator is overloaded: the first number stands for the lowerbound (we don’t want it to have a length of zero) and the second is the upperbound.
Notice the extra “using” to be able to use the Validator attributes.

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;
using Microsoft.Practices.EnterpriseLibrary.Validation;
using MyCustomValidators;

namespace BLCustomers
{
    public class Customer
    {
        private string name;
        private string email;

        public Customer() { }

        public Customer(string name, string email)
        {
            this.name = name;
            this.email = email;
        }

        [NotNullValidator]
        [StringLengthValidator(1, 100)]
        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        [NotNullValidator]
        public string Email
        {
            get { return email; }
            set { email = value; }
        }
   }
}

At the moment, nothing actually triggers this validation yet. We can do this in several ways.
The simplest manner is using the Validation façade, included in the VAB, as shown next.

I have created a very simple interface in the Forms project, where the user can enter a name and email, as shown below.

1.JPG

In the click-event of the Validate button, the Customer instance is created. After that, the ValidateCustomer method is called, which is a method in the business layer. 

        private void btnValidate_Click(object sender, EventArgs e)
        {
            Customer customer = new Customer(txtName.Text, txtEmail.Text);

            MessageBox.Show(customer.ValidateCustomer());
        }


Now, let’s take a look at the actual validation. This is performed in the business layer in the Customer class. Let’s look at the code.

        public string ValidateCustomer()
        {
            ValidationResults results = Validation.Validate(this);
            string message = string.Empty;

            if (!results.IsValid)
            {
                // if this is not valid, we'll loop through the results to create the message
                foreach (ValidationResult result in results)
                {
                    message += result.Message;
                }
            }
            if(message.Equals(string.Empty))
            {
                message = "The input is valid!";
            }
            return message;
        }

The ValidationResults is a collection of ValidationResult objects. When the Validate method is called, each attribute on every property is checked, and whenever one does not validate correctly, a new instance of ValidationResult is added to the collection. After the validation, you can loop through the collection to check the messages that were added (sort of “exception-messages” that are added). If all validation goes well, the IsValid method will return true.


This concludes the first way of doing validation: we have not used the configuration files (which is however done very often with the enterprise library). We did use attributes and the Validate method to check if the object was valid.

I said “the first way”… That means there are more ways of performing validation without using the configuration files? Yes, there is. In fact, this second method will look more familiar if you have used previous versions of the enterprise library.
Other application blocks often make use of Factory methods (like for example the data access application block). The VAB also has a way of doing this.

public string ValidateCustomerWithFactoryMethod()
        {
            string message = string.Empty;

            IValidator<Customer> validatorCustomer = ValidationFactory.CreateValidator<Customer>();

            ValidationResults results = validatorCustomer.Validate(this);

            if (!results.IsValid)
            {
                // if this is not valid, we'll loop through the results to create the message
                foreach (ValidationResult result in results)
                {
                    message += result.Message;
                }
            }
            if (message.Equals(string.Empty))
            {
                message = "The input is valid!";
            }
            return message;
        }


The result of the above code is the same.

Creating your own Validators

Up until now, we have used only the built-in validators. Nevertheless these are useful, a day will come (and if you’re developing large applications, it will come soon…) that they will not suffice. Therefore, the architecture of the VAB is open so you can easily create your own validators.
In this second part, I’ll show you how.

Let’s assume that we want to create an email validator. For the sake of simplicity, we’ll have it check if the string contains an “@” character.

To start, let’s create an additional project in our solution named MyCustomValidators. Make this project a class library too. Add the same references as you did with the BLCustomers project.

Create a class named EmailValidatorAttribute. This will be the attribute we’ll be adding to our Customer object later on.
For a class to be used as an attribute, it must among others things, inherit from Attribute. We’ll have it inherit from ValidatorAttribute, that already inherits from Attribute.

public sealed class EmailValidatorAttribute : ValidatorAttribute
    {
        public override IValidator CreateValidator()
        {
            return new EmailValidator(this.GetMessageTemplate());
        }
    }

Now, let’s create the actual EmailValidator class, which is where the actual validation will take place.

    public class EmailValidator : ValidatorBase
    {
        public EmailValidator()
            : this(null)
        { }

        public EmailValidator(string messageTemplate)
            : base(messageTemplate)
        { }

        protected override void DoValidate(object target, ValidationResults validationResults)
        {
            try
            {
                string converted = (string)target;
                if (!converted.Contains("@"))
                {
                    this.AddResult(validationResults, new ValidationResult(this.MessageTemplate));
                }
            }
            catch
            {
                this.AddResult(validationResults, new ValidationResult(this.MessageTemplate));
            }
        }

        protected override string GetDefaultMessageTemplate()
        {
            return "This is not a valid emailaddress since it does not contain the @ character";
        }
    }

It inherits from ValidatorBase, and overrides 2 methods in particular: DoValidate and GetDefaultMessageTemplate.
In the DoValidate method, the actual validation is done: here, I have written a few lines of simple code to check whether the passed string contains a “@”.
If the string does not include this character (and is therefore not an email address), a new instance of ValidationResult is added to the collection. The message that is included here is the string returned from GetDefaultMessageTemplate.

Now, we can use our own attribute. Return to the Customer class and add the EmailValidator-attribute to the email property.

        [NotNullValidator]
        [StringLengthValidator(1, 100)]
        public string Name
        {
            get { return name; }
            set { name = value; }
        }

When you run the application again, and you enter a string without a @ as email, you’ll get a message window with the message you included in the EmailValidator class.


I hope this will help you understand the Validation Application Block. If you have any questions, please feel free to post them.


Posted on Tuesday, 10 July 2007 23:39 by gill  |  Comments (93)
Filed under:   .net | C#

Related posts

Comments

August 7. 2007 07:43

Adam

Great article! One question though...what is ValidatorBase?

Thanks!
Adam

Adam

January 31. 2008 02:42

Chad

Really nice article. The quick tutorial on creating a customer validator was especially appreciated.

Cheers,

Chad

Chad

November 25. 2008 06:12

chandu

can we have common dll for all validations or atleast 60% of validations.

Thanks
chandu

chandu

July 11. 2009 02:25

Web design


Useful article.
Thanks for helpful information you catch up us with your instructional explanation.

Web design

July 19. 2009 06:09

club penguin cheats

Really nice article. The quick tutorial on creating a customer validator was especially appreciated.

club penguin cheats

August 17. 2009 06:41

seo company

Nice post.I’m really impressed with your article, such great information you mentioned here..

seo company

August 28. 2009 02:34

Web design


adding Extensions and Advertising is much better idea for the blogs

Web design

September 2. 2009 05:12

online personal classifieds

Great article! Thank you very much!

regards

online personal classifieds http://informationex.com

online personal classifieds

October 16. 2009 04:19

cash advance

Hmmm interesting stuff

cash advance

October 21. 2009 02:59

wedding dj nj

I added your post to my college Report


Regards

Miller

wedding dj nj

October 23. 2009 05:21

Chinese Translation Service

I digged this for more news from you.



Regards and respect
Buti

Chinese Translation Service

October 24. 2009 19:36

Cheap Aion kinah

I loved the way you exlained things. Much better many here


Regards

krich off

Cheap Aion kinah

October 24. 2009 21:41

Cheap Aion kinah

I loved the way you exlained things. Much better many here


Regards

krich off

Cheap Aion kinah

October 25. 2009 03:28

online cash loans

Nice post . keep up the good work

online cash loans

November 3. 2009 03:46

childhood autism

I’d love to have my husband here, as I cannot really understand what is written here.

childhood autism

November 3. 2009 18:25

online personal loans

Interesting ... as always - is your blog making any cash advance ? ;)

online personal loans

November 5. 2009 12:50

punk rock

very interesting post

punk rock

November 7. 2009 04:59

fast personal loans

Do you make money out of this blog? just curious

fast personal loans

November 9. 2009 07:26

pay day loans

Nice resource. rss feed added

pay day loans

November 9. 2009 09:14

ridgid power tools

This article gives the light in which we can observe the reality. this is very nice one and gives indepth information. thanks for this nice article

ridgid power tools

November 9. 2009 09:15

Stress Reduction Holiday Gifts

Have you ever considered adding more videos to your blog posts to keep the readers more entertained? I mean I just read through the entire article of yours and it was quite good but since I'm more of a visual learner,I found that to be more helpful well let me know how it turns out! I love what you guys are always up too. Such clever work and reporting! Keep up the great works guys I've added you guys to my blogroll. This is a great article thanks for sharing this informative information.. I will visit your blog regularly for some latest post.

Stress Reduction Holiday Gifts

November 10. 2009 13:38

backlink checker

Do you accept guest posts? I would love to write couple articles here.
I was wondering what is up with that weird gravatar??? I know 5am is early and I'm not looking my best at that hour, but I hope I don't look like this! I might however make that face if I'm asked to do 100 pushups. lol

backlink checker

November 11. 2009 17:26

internet mortgage leads

Nice to be visiting your blog again, it has been months for me. Well this article that i've been waited for so long. I need this article to complete my assignment in the college, and it has same topic with your article. Thanks, great share.

internet mortgage leads

November 12. 2009 07:37

Free government debt consolidation

This is a really good read for me, Must admit that you are one of the best bloggers I ever saw.Thanks for posting this informative article.

Free government debt consolidation

November 12. 2009 17:44

payday loans

Just try to smile for about 2-3 mins then you can get back to work

payday loans

November 13. 2009 10:58

natural hemorrhoid treatments

There are certainly a lot of details like that to take into consideration. That is a great point to bring up. I offer the thoughts above as general inspiration but clearly there are questions like the one you bring up where the most important thing will be working in honest good faith. I don?t know if best practices have emerged around things like that, but I am sure that your job is clearly identified as a fair game.

natural hemorrhoid treatments

November 13. 2009 15:23

payday loans

thanks! very helpful post!! like the template btw ;)

payday loans

November 14. 2009 07:55

Lyrics

You may have not intended to do so, but I think you have managed to express the state of mind that a lot of people are in. The sense of wanting to help, but not knowing how or where, is something a lot of us are going through.

Lyrics

November 14. 2009 19:30

Panasonic bread maker

You really make it seem so easy with your presentation but I find this topic to be really something which I think I would never understand. It seems too complicated and very broad for me. I am looking forward for your next post, I will try to get the hang of it!

Panasonic bread maker

November 15. 2009 08:06

Los Angeles Auto Insurance

Nice information, many thanks to the author. It is incomprehensible to me now, but in general, the usefulness and significance is overwhelming. Thanks again and good luck!

Los Angeles Auto Insurance

November 16. 2009 00:24

payday loans

Yea nice Work !Laughing

payday loans

November 16. 2009 06:42

Song Lyrics

You really make it seem so easy with your presentation but I find this topic to be really something which I think I would never understand. It seems too complicated and very broad for me. I am looking forward for your next post, I will try to get the hang of it!

Song Lyrics

November 16. 2009 07:19

szerencsejatek

Hi webmaster, commenters and everybody else !!! The blog was absolutely fantastic! Lots of great information and inspiration, both of which we all need!b Keep 'em coming... you all do such a great job at such Concepts... can't tell you how much I, for one appreciate all you do!

szerencsejatek

November 16. 2009 08:24

szerencsejatek

Admiring the time and effort you put into your blog and detailed information you offer! I will bookmark your blog and have my children check up here often. Thumbs up!

szerencsejatek

November 16. 2009 09:21

press release submission

Just wanted to give you a shout from the valley of the sun, great information. Much appreciated.

press release submission

November 17. 2009 01:17

abercrombie and fitch

Just try to smile for about 2-3 mins then you can get back to work

abercrombie and fitch

November 17. 2009 09:45

A rowing machine

Nice to be visiting your blog again, it has been months for me. Well this article that i've been waited for so long. I need this article to complete my assignment in the college, and it has same topic with your article. Thanks, great share.

A rowing machine

November 17. 2009 10:35

bad breath cause

Valuable information and excellent design you got here! I would like to thank you for sharing your thoughts and time into the stuff you post!! Thumbs up

bad breath cause

November 17. 2009 18:36

cacao

This is such a great resource that you are providing and you give it away for free. I love seeing websites that understand the value of providing a quality resource for free. It is the old what goes around comes around routine. Did you acquired lots of links and I see lots of trackbacks??

cacao

November 17. 2009 19:07

cacao

You got a really useful blog I have been here reading for about an hour. I am a newbie and your success is very much an inspiration for me.

cacao

November 18. 2009 08:11

acai fruit juices

Thanks for taking the time to discuss this, I feel strongly about it and love learning more on this topic. If possible, as you gain expertise, would you mind updating your blog with more information? It is extremely helpful for me.

acai fruit juices

November 18. 2009 21:39

Linda Mirano

Dude.. I am not much into reading, but somehow I got to read lots of articles on your blog. Its amazing how interesting it is for me to visit you very often.

Linda Mirano

November 19. 2009 21:03

cash loan

Interesting ... as always - is your blog making any cash advance ? ;)

cash loan

November 20. 2009 12:52

standard process supplements

I am not much of a guy who thinks in so deeply about web design but I think your post had some valid points in it. Like designers are forced to design stuff within the limited code available and not go beyond it, their innovation is somewhat limited but still I think Web Design won't die! I agree that Amazon and other some big sites won't have a blog but now a days it's very important to have some sort of option available so people can quickly communicate their thoughts. I think Amazon if wants to shift it to that, they can get a customized CMS for themselves.

standard process supplements

November 21. 2009 13:58

singapore flower

Have you ever considered adding more videos to your blog posts to keep the readers more entertained? I mean I just read through the entire article of yours and it was quite good but since I'm more of a visual learner,I found that to be more helpful well let me know how it turns out! I love what you guys are always up too. Such clever work and reporting! Keep up the great works guys I've added you guys to my blogroll. This is a great article thanks for sharing this informative information.. I will visit your blog regularly for some latest post.

singapore flower

November 22. 2009 13:35

payday loans

I always wanted to write in my site something like that but I guess you'r faster Smile

payday loans

November 23. 2009 21:23

how to get rid of scabies

Great post! I am just starting out in community management/marketing media and trying to learn how to do it well - resources like this article are incredibly helpful. As our company is based in the US, it?s all a bit new to us. The example above is something that I worry about as well, how to show your own genuine enthusiasm and share the fact that your product is useful in that case.

how to get rid of scabies

November 26. 2009 07:28

paydayloans

Do you have any more info on this?

paydayloans

November 27. 2009 17:00

free online dating

I would like to thank you for the efforts you have made in writing this article. I am hoping the same best work from you in the future as well. In fact your creative writing abilities has inspired me to start my own BlogEngine blog now. Really the blogging is spreading its wings rapidly. Your write up is a fine example of it.

free online dating

November 29. 2009 08:28

diets that work fast

You may have not intended to do so, but I think you have managed to express the state of mind that a lot of people are in. The sense of wanting to help, but not knowing how or where, is something a lot of us are going through.

diets that work fast

November 30. 2009 10:35

paydayloans

Do you make money out of this blog? just curious

paydayloans

November 30. 2009 14:01

Hazwoper Online Training

Resources like the one you mentioned here will be very useful to me! I will post a link to this page on my blog. I am sure my visitors will find that very useful.

Hazwoper Online Training

December 1. 2009 16:31

payday loans

Searching for this for some time now - i guess luck is more advanced than search engines Smile

payday loans

December 2. 2009 13:10

LN32A450 Information

Have you ever considered adding more videos to your blog posts to keep the readers more entertained? I mean I just read through the entire article of yours and it was quite good but since I'm more of a visual learner,I found that to be more helpful well let me know how it turns out! I love what you guys are always up too. Such clever work and reporting! Keep up the great works guys I've added you guys to my blogroll. This is a great article thanks for sharing this informative information.. I will visit your blog regularly for some latest post.

LN32A450 Information

December 3. 2009 01:24

quick weight loss diet

This was novel. I wished I could read every post, but i have to go back to work now... But I'll be back.

quick weight loss diet

December 3. 2009 02:16

business

Thanks for taking the time to share this, I feel strongly about it and love learning more on this topic. If possible, as you gain knowledge, would you mind updating your blog with extra information? It is extremely useful for me.

business

December 4. 2009 09:19

Childrens Party Favors

I would like to thank you for the efforts you have made in writing this article. I am hoping the same best work from you in the future as well. In fact your creative writing abilities has inspired me to start my own BlogEngine blog now. Really the blogging is spreading its wings rapidly. Your write up is a fine example of it.

Childrens Party Favors

December 6. 2009 13:58

parking at gatwick

Excellent read, I just passed this onto a colleague who was doing a little research on that. And he actually bought me lunch because I found it for him smile So let me rephrase that: Thanks for lunch!

parking at gatwick

December 7. 2009 23:40

real estate flipping

I admire the valuable information you offer in your articles. I will bookmark your blog and have my children check up here often. I am quite sure they will learn lots of new stuff here than anybody else!

real estate flipping

December 8. 2009 00:30

Women Ed Hardy Swimwear

Thanks for your information, i have read it, very good!

Women Ed Hardy Swimwear

December 8. 2009 00:31

Women Ed Hardy Swimwear

Thanks for your information, i have read it, very good!

Women Ed Hardy Swimwear

December 10. 2009 00:16

Abercrombie & Fitch

Good!

Abercrombie & Fitch

December 10. 2009 00:16

cheap christian louboutin Shoes

Good information!

cheap christian louboutin Shoes

December 11. 2009 14:03

portable ceramic heaters

Valuable information and excellent design you got here! I would like to thank you for sharing your thoughts and time into the stuff you post!! Thumbs up

portable ceramic heaters

December 12. 2009 10:09

Guided Meditation

I was just browsing for related blog posts for my project research and I happened to stumble upon yours. Thanks for the useful information! Smile

Guided Meditation

December 12. 2009 13:53

burglar alarms

Valuable information and excellent design you got here! I would like to thank you for sharing your thoughts and time into the stuff you post!! Thumbs up

burglar alarms

December 12. 2009 21:47

Rental Property

Valuable information and excellent design you got here! I would like to thank you for sharing your thoughts and time into the stuff you post!! Thumbs up

Rental Property

December 13. 2009 06:52

Free Cartoon

Took me awhile to read all the comments, but I really enjoyed the article. It proved to be very helpful to me and I am sure to all the commenters here! It's always nice when you can not only be informed, but also engaged! I'm sure you had fun writing this article.

Free Cartoon

December 13. 2009 16:30

oregon bankruptcy

Well, this is my first visit to your blog! We are a group of volunteers and starting a new initiative in a community in the same niche. Your blog provided us valuable information to work on. You have done a marvellous job!

oregon bankruptcy

December 15. 2009 05:34

pepper sprays

This was novel. I wished I could read every post, but i have to go back to work now... But I'll return.

pepper sprays

December 15. 2009 23:26

abercrombie and fitch

your article is excellent,i really love it. hoping to read your following.

abercrombie and fitch

December 16. 2009 04:26

pdf brander

This is my first time i visit here. I found so many entertaining stuff in your blog, especially its discussion. From the tons of comments on your posts, I guess I am not the only one having all the leisure here! Keep up the good work.

pdf brander

December 17. 2009 01:16

online dating

Please suggest me some online tutorials to learn input validation using PHP and MySQL?

online dating

December 17. 2009 02:20

online poker

Where can I get PHP code libraries to convert file formats?

online poker

December 18. 2009 00:48

tiffany jewelry

Lastly, I have said this before and will keep saying it for every related post.Don't try to hard,the best things come when you least expect them to. Don't cry because it is over,smile because it happened.

tiffany jewelry

December 18. 2009 13:36

teeth whitening gel

Do you accept guest posts? I would love to write couple articles here.
I was wondering what is up with that weird gravatar??? I know 5am is early and I'm not looking my best at that hour, but I hope I don't look like this! I might however make that face if I'm asked to do 100 pushups. lol

teeth whitening gel

December 18. 2009 16:01

Quick Bean Recipes

You really make it seem so easy with your presentation but I find this topic to be really something which I think I would never understand. It seems too complicated and very broad for me. I am looking forward for your next post, I will try to get the hang of it!

Quick Bean Recipes

December 18. 2009 16:01

Quick Sauce recipes

I personally have embraced the new technologies and the CMS platforms, I think the new tools only make the web designs better. I am glad that new technologies are coming out in web design that make things easier, improved, and better looking for design.

Quick Sauce recipes

December 19. 2009 00:58

tiffany co jewelry

earrings, bracelets, necklaces and pendants reflects your super insightful vision and you will never regret about your selection. For the utmost in jewelry gifts, there is no higher standard than Tiffany jewelry. Their creations are of stunning elegance and captivating originality.

tiffany co jewelry

December 19. 2009 08:59

Denver DUI Lawyer

It is almost good version u have given so far.It will faciltate us very much. Your techniques are so good and samples are also good.

Denver DUI Lawyer

December 19. 2009 14:01

IT contractor accountant

When I originally commented I clicked the "Notify me when new comments are added" checkbox and now each time a comment is added I get four emails with the same comment.
Is there any way you can remove me from that service?
Thanks!

IT contractor accountant

December 21. 2009 00:40

Tiffany

I really appreciate the kind of topics you post here. Thanks for sharing us a great information that is actually helpful. Good day!

Tiffany

December 21. 2009 04:07

usa online casinos jes

Me and my friend were arguing about an issue similar to this! Now I know that I was right. lol! Thanks for the information you post.

usa online casinos jes

December 21. 2009 05:01

casino proudly

I admire what you have done here. I like the part where you say you are doing this to give back but I would assume by all the comments that this is working for you as well.

casino proudly

December 21. 2009 06:42

us online casinos art

Nice to be visiting your blog again, it has been months for me. Well this article that i've been waited for so long. I need this article to complete my assignment in the college, and it has same topic with your article. Thanks, great share.

us online casinos art

December 21. 2009 07:38

buy fioricet here

Thank you for another great article. Where else could anyone get that kind of information in such a perfect way of writing? I have a presentation next week, and I am on the look for such information.

buy fioricet here

December 22. 2009 08:34

thermogenic fat burner

this is suppose to be the best post i have ever come across

thermogenic fat burner

December 22. 2009 17:22

pool solar panels

I admire the valuable information you offer in your articles. I will bookmark your blog and have my children check up here often. I am quite sure they will learn lots of new stuff here than anybody else!

pool solar panels

December 22. 2009 22:29

ben cummings

Well, this is my first visit to your blog! We are a group of volunteers and starting a new initiative in a community in the same niche. Your blog provided us valuable information to work on. You have done a marvellous job!

ben cummings

December 22. 2009 23:27

southwest idaho real estate

You got a really useful blog I have been here reading for about an hour. I am a newbie and your success is very much an inspiration for me.

southwest idaho real estate

December 23. 2009 02:48

computer solutions

Took me awhile to read all the comments, but I really love the article. It proved to be very helpful to me and I am sure to all the commenters here! It's always nice when you can not only be informed, but also entertained! I'm sure you had joy writing this article.

computer solutions

December 23. 2009 04:44

online broker

Thanks for taking the time to share this, I feel strongly about it and love learning more on this topic. If possible, as you gain knowledge, would you mind updating your blog with more information? It is extremely helpful for me.

online broker

December 23. 2009 09:49

payday loans

Nice resource. rss feed added

payday loans