Skip to content

A lightweight product configurator for .NET

Notifications You must be signed in to change notification settings

obhurr/Configify

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Configify

A lightweight product configurator for .NET

Configify is a framework to allow simple products to be configured.

#How to use - Pizza example A pizza has a size, a crust, and toppings. The size can be either small, medium, or large and only 1 choice is allowed. Likewise the crust can be either thick, thin, or cheese stuffed and only 1 choice is allowed. The toppings are a bit different. Multiple toppings can be added. The following code defines a Pizza configuration with all available sub items and their options and rules.

public class PizzaConfigurationBuilder
{
    public Configuration Build()
    {
        var pizza = new Configuration
        {
            Name = "Pizza",
            Description = "Build your own Pizza"
        };

        pizza.ConfigurationItems.Add(BuildSizeItem(1));
        pizza.ConfigurationItems.Add(BuildCrustItem(2));
        pizza.ConfigurationItems.Add(BuildToppingsItem(3));

        return pizza;
    }

    private ConfigurationItem BuildSizeItem(int sequence)
    {
        var configurationItem = new ConfigurationItem
        {
            Name = "Size",
            Sequence = sequence,
            EndUserInstructions = "Choose your Size"
        };

        configurationItem.ConfigurationRules.Add(new MaxSelectedOptionsRule {Count = 1});
        configurationItem.ConfigurationRules.Add(new MinSelectedOptionsRule {Count = 1});

        configurationItem.ConfigurationItemOptions.Add(new ConfigurationItemOption
        {
            Name = "Small",
            Description = "4 slices, feeds 1 person",
            Sequence = 1
        });

        configurationItem.ConfigurationItemOptions.Add(new ConfigurationItemOption
        {
            Name = "Medium",
            Description = "8 slices, feeds 2 people",
            Sequence = 2
        });

        configurationItem.ConfigurationItemOptions.Add(new ConfigurationItemOption
        {
            Name = "Large",
            Description = "16 slices, feeds 3 or 4 people",
            Sequence = 3
        });

        return configurationItem;
    }

    private ConfigurationItem BuildCrustItem(int sequence)
    {
        var configurationItem = new ConfigurationItem
        {
            Name = "Crust",
            Sequence = sequence,
            EndUserInstructions = "Choose your Crust"
        };

        configurationItem.ConfigurationRules.Add(new MaxSelectedOptionsRule { Count = 1 });
        configurationItem.ConfigurationRules.Add(new MinSelectedOptionsRule { Count = 1 });

        configurationItem.ConfigurationItemOptions.Add(new ConfigurationItemOption
        {
            Name = "Thin",
            Sequence = 1
        });

        configurationItem.ConfigurationItemOptions.Add(new ConfigurationItemOption
        {
            Name = "Thick",
            Sequence = 2
        });

        configurationItem.ConfigurationItemOptions.Add(new ConfigurationItemOption
        {
            Name = "Cheese Filled",
            Sequence = 3
        });

        return configurationItem;
    }

    private ConfigurationItem BuildToppingsItem(int sequence)
    {
        var configurationItem = new ConfigurationItem
        {
            Name = "Toppings",
            Sequence = sequence,
            EndUserInstructions = "Choose your toppings"
        };
        configurationItem.ConfigurationRules.Add(new MinSelectedOptionsRule { Count = 1 });

        configurationItem.ConfigurationItemOptions.Add(new ConfigurationItemOption
        {
            Name = "Extra Cheese",
            Sequence = 1
        });

        configurationItem.ConfigurationItemOptions.Add(new ConfigurationItemOption
        {
            Name = "Pepperoni",
            Sequence = 2
        });

        configurationItem.ConfigurationItemOptions.Add(new ConfigurationItemOption
        {
            Name = "Sausage",
            Sequence = 3
        });

        configurationItem.ConfigurationItemOptions.Add(new ConfigurationItemOption
        {
            Name = "Canadian Bacon",
            Sequence = 4
        });

        configurationItem.ConfigurationItemOptions.Add(new ConfigurationItemOption
        {
            Name = "Mushrooms",
            Sequence = 5
        });

        return configurationItem;
    }
}

Now that the pizza configuration has been defined, we can execute it and supply our own options, just as if we were a customer ordering a pizza. The helper ConfigurationItemOptionsSetter class is used to set option values.

//Get our configuration for a pizza
var configurationBuilder = new PizzaConfigurationBuilder();
var configuration = configurationBuilder.Build();

//Set our options
var optionsSetter = new ConfigurationItemOptionsSetter();
optionsSetter.SetOrUnSet(configuration.ConfigurationItems, "Size", "Large", true);
optionsSetter.SetOrUnSet(configuration.ConfigurationItems, "Crust", "Thick", true);
optionsSetter.SetOrUnSet(configuration.ConfigurationItems, "Toppings", "Extra Cheese", true);
optionsSetter.SetOrUnSet(configuration.ConfigurationItems, "Toppings", "Pepperoni", true);

//Make sure the configuration is correct
var checker = new ConfigurationRulesChecker();
List<string> errors;
checker.Check(configuration, out errors);

if (errors.Any())
{
	return;
}

//Export the results to JSON
var exporter = new ConfigurationExporter();
var output = exporter.ExportToJson(configuration);

About

A lightweight product configurator for .NET

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published