Skip to content

Instantly share code, notes, and snippets.

@muralinarasimhan
Created September 23, 2014 01:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save muralinarasimhan/49361dd717e9cffcee6b to your computer and use it in GitHub Desktop.
Save muralinarasimhan/49361dd717e9cffcee6b to your computer and use it in GitHub Desktop.
Parameterized Abstract Factory with NancyFx TinyIoC
public class CafeModule : NancyModule
{
public CafeModule( IDrinkFactory iDrinkFactory)
: base("/api/drinks")
{
Get["/{id}"] = _ =>
{
IDrink drink = iDrinkFactory.Create((int) _.id);
};
}
}
public class Coffee : IDrink
{
public string GetLabel()
{
return "Nescafe";
}
}
public class CustomNancyBootstrapper : DefaultNancyBootstrapper
{
protected override void ApplicationStartup(
TinyIoCContainer container,
Nancy.Bootstrapper.IPipelines pipelines)
{
Coffee coffee = new Coffee();
Tea tea = new Tea();
container.Register<IDrink>(coffee,
EnumHelper.GetEnumDescription(DrinkType.Coffee));
container.Register<IDrink>(tea,
EnumHelper.GetEnumDescription(DrinkType.Tea));
}
}
public class DrinkFactory : IDrinkFactory
{
private Func<String, IDrink> drink;
public DrinkFactory(Func<String, IDrink> iDrink)
{
drink = iDrink;
}
public IDrink Create(int drinkType)
{
switch (drinkType)
{
case 1:
return drink.Invoke(
EnumHelper.GetEnumDescription(DrinkType.Coffee));
case 2:
return drink.Invoke(
EnumHelper.GetEnumDescription(DrinkType.Tea));
default:
return null;
}
}
}
}
public enum DrinkType
{
[Description("Coffee")]
Coffee = 1,
[Description("Tea")]
Tea
}
public static class EnumHelper
{
public static string GetEnumDescription(Enum value)
{
FieldInfo fi = value.GetType().GetField(value.ToString());
DescriptionAttribute[] attributes =
(DescriptionAttribute[]) fi.GetCustomAttributes(
typeof (DescriptionAttribute), false);
if (attributes != null && attributes.Length > 0)
{
return attributes[0].Description;
}
else
{
return value.ToString();
}
}
}
public interface IDrink
{
string GetLabel();
}
public interface IDrinkFactory
{
IDrink Create(int drinkType);
}
public class Tea : IDrink
{
public string GetLabel()
{
return "Tetley";
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment