public void ProductCRUD(ProductDataConfiguration config)
        {
            Console.WriteLine("Creating data source from config: " + config.Type + " cache: " + config.UseCache);
            IProductData data = ProductStorageFactory.GetProductData(config);

            Console.WriteLine("Testing Create, Read, Update and Delete with " + data.ToString());
            var product = Resources.GetProduct();
            int id = data.StoreProduct(product);

            Assert.NotNull(id);
            Assert.True(id > 0);
            Console.WriteLine("Create Passed");

            var returned = data.GetProductById(id);

            Assert.AreEqual(id, returned.ProductID);
            Assert.AreEqual(product.Name, returned.Name);
            Assert.AreEqual(product.SalePrice, returned.SalePrice);
            Assert.AreEqual(product.PurchasePrice, returned.PurchasePrice);
            Console.WriteLine("Read Passed");

            data.DeleteProduct(id);

            returned = data.GetProductById(id);
            Assert.Null(returned);
            Console.WriteLine("Delete Passed");
        }
        public void InventoryCRUD(ProductDataConfiguration config)
        {
            Console.WriteLine("Creating data source from config: " + config.Type + " cache: " + config.UseCache);
            IProductData data = ProductStorageFactory.GetProductData(config);

            Console.WriteLine("Testing Create, Read, Update and Delete with " + data.ToString());
            var product = Resources.GetProduct();
            int id = data.StoreProduct(product);

            Assert.NotNull(id);
            Assert.True(id > 0);
            Console.WriteLine("Create Passed");

            data.SetInventory(id, 100);
            var returned = data.GetProductById(id);
            Assert.AreEqual(100, returned.Inventory);
            data.UpdateInventory(id, -2);
            returned = data.GetProductById(id);
            Assert.AreEqual(98, returned.Inventory);
            Console.WriteLine("Updated Passed");

            data.DeleteProduct(id);

            returned = data.GetProductById(id);
            Assert.Null(returned);
            Console.WriteLine("Delete Passed");
        }
        public static IProductData GetProductData(ProductDataConfiguration config)
        {
            if (config == null) throw new ArgumentNullException("config");
            IProductData dataStore;
            switch(config.Type)
            {
                case eStorageType.MySql:
                    dataStore = new MySqlProductData(config.ConnectionString);
                    break;
                case eStorageType.SqlServer:
                    dataStore = new SqlServerProductData(config.ConnectionString);
                    break;
                case eStorageType.Xml:
                    dataStore = new XmlProductData(config.FilePath);
                    break;
                case eStorageType.Runtime:
                    dataStore = new RuntimeProductData();
                    break;
                default:
                    throw new NotImplementedException(config.Type.ToString());
            }

            return config.UseCache ? new ProductCache(dataStore) : dataStore;
        }