Property validation

Topics: Validation Application Block
Aug 26, 2008 at 3:46 PM
I have problem validating properties using attributes. I have tried with the following code:


using System;

using Microsoft.Practices.EnterpriseLibrary.PolicyInjection;
using Microsoft.Practices.EnterpriseLibrary.PolicyInjection.CallHandlers;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;
using Microsoft.Practices.Unity;

namespace Validation
{
    public class Program
    {
        static void Main(string[] args)

        {
           ICustomer customer = new Customer();

            try
            {
                customer.Name = null;
            }
            catch (Exception ex)
           {
                Console.WriteLine(ex.Message);
            }

            Console.ReadLine();

        }
    }


    public interface ICustomer
    {
       string Name
        {
            get;

            [ValidationCallHandler]
            [NotNullValidator(MessageTemplate = "Can not be null")]
            set;
        }
    }


    public class Customer : MarshalByRefObject, ICustomer
    {
        public string Name { get; set; }
    }
}



I would like to get an Exception when i set customer.Name = null. I've tried putting the attributes in the concrete class above the property and also before the set method without success and I can't find any good examples of how to validate properties using . I'm using EntLib 4.
Aug 26, 2008 at 11:56 PM
Hi,

You need to involve the PIAB in the creation of your Customer instance; this topic should help you http://msdn.microsoft.com/en-us/library/cc511841.aspx

   12             ICustomer customer = PolicyInjection.Create<Customer, ICustomer>();

<!--EndFragment-->
Next, you need to appropriately target the attributes. Since this is a property, you need to use explicit attribute targets like this:

   25     public interface ICustomer

   26     {

   27         string Name

   28         {

   29             get;

   30             [method: ValidationCallHandler]

   31             [param: NotNullValidator(MessageTemplate = "Can not be null")]

   32             set;

   33         }

   34     }


Finally, you are both implementing an interface and extending MarshalByRefObject. While this won't hurt, it's not necessary to have both to do policy injection.

Hope this helps,
Fernando
Aug 27, 2008 at 7:19 AM
Sweet, thanks!

Lina
Aug 27, 2008 at 9:33 AM
Is there a way to see what property caused the exception? From the Exception I get:

Parameter validation failed
Parameter name: value

for all my properties. Maybe I can use the Exception Handling Application Block to get the message from MessageTemplate?


Aug 27, 2008 at 1:12 PM
Hi,

The EHAB will not help you here. You specify different message templates for the different properties on the validators themselves, or specify a Tag to the all validators on each property. It would help if the ArgumentValidationException had a property with the name of the method, but I'm not sure it would fit with the design of its base class, ArgumentException. You may want to log feature request for a Method property in the ArgumentValidationException.

Regards,
Fernando
Aug 28, 2008 at 3:40 PM
Ok, I got the information from the ArgumentValidationException and the ValidationResults in that exception, it is sufficient for my application. Thank you!
Sep 16, 2008 at 5:30 AM

Hi,
I too am having issues using Enterprise Lib 4.0 and trying to validate properties.
I have a WCF service and have a property on a class checking for nulls
/*****************************************************
        [Microsoft.Practices.EnterpriseLibrary.Validation.Validators.NotNullValidator(Ruleset = "WCFNotNull", MessageTemplate = "Price must be between 1 and 50 characters")]
        [WcfSerialization::DataMember(Name = "Price", IsRequired = false, Order = 2)]
        public String Price
        {
            get { return price; }
            set { price = value; }
        }
*****************************************************/ 
And a call to validate that class
/*****************************************************
            Validator<PizzaService.DataContracts.Pizza> validator = ValidationFactory.CreateValidator<PizzaService.DataContracts.Pizza>("WCFNotNull");
            //ValidationResults results = validator.Validate(customer);
            PizzaService.DataContracts.Pizza pizza
                = new PizzaService.DataContracts.Pizza();
            pizza.Price = null;
            ValidationResults results = validator.Validate(pizza);
*****************************************************/

But it doesn't error.
I have tried just about all the combinations of the Validation Application block that I can find on the internet.
I have not seen a walkthrough for using Enterprise Lib 4.0 with WCF under .net 3.5

I have successful used the above syntax with Enterprise Lib 3.0 with WCF under .net 2.0 (last year).

I don't need best practice or another link to the theory of this.
What I really need is a simple walkthrough or a simple working example of Validation Application Block working with WCF under .Net 3.5.

Does anybody know how to get this working??

Regards

FrazGJF