#Tube
Tube is a basic task pipeline for C#
install-package tube
[TaskName("weigh ingredients")]
public class Weigher : Task<CakeMaker>
{
public override void Execute(CakeMaker context)
{
context.WeighIngredients();
Console.WriteLine("Ingredients weighed");
}
}
[TaskName("mix ingredients")]
[TaskDependsOn("weigh ingredients")]
public class Mixer : Task<CakeMaker>
{
public override void Execute(CakeMaker context)
{
context.MixIngredients();
Console.WriteLine("Ingredients mixed");
}
}
[TaskName("bake")]
[TaskDependsOn("mix ingredients")]
public class Baker : Task<CakeMaker>
{
public override void Execute(CakeMaker context)
{
context.Bake();
Console.WriteLine("Cake baked");
}
}
[TaskName("prepare icing")]
[TaskDependsOn("mix ingredients")]
public class IcingPreparer : Task<CakeMaker>
{
public override void Execute(CakeMaker context)
{
context.PrepareIcing();
Console.WriteLine("Cake iced");
}
}
[TaskName("decorate")]
[TaskDependsOn("prepare icing", "bake")]
public class CakeDecorator : Task<CakeMaker>
{
public override void Execute(CakeMaker context)
{
context.Decorate();
Console.WriteLine("Cake decorated");
}
}
[TaskName("make cake")]
[TaskDependsOn("decorate", "bake")]
public class CakeBuilder : Task<CakeMaker>
{
public override void Execute(CakeMaker context)
{
Console.WriteLine("Cake made");
}
}var factory = new PipelineFactory();
var pipeline = factory.Create<CakeMaker>()
.RegisterTask<Weigher>()
.RegisterTask<Mixer>()
.RegisterTask<Baker>()
.RegisterTask<IcingPreparer>()
.RegisterTask<CakeDecorator>()
.RegisterTask<CakeBuilder>();var cakeMaker = new CakeMaker();
pipeline.Run("make cake", cakeMaker);Output:
Ingredients weighed
Ingredients mixed
Cake baked
Cake iced
Cake decorated
Cake made
Subscribe to update messages for your task like this:
pipeline.Subscribe<TaskUpdated>(x => Console.WriteLine(x.Message))Publish messages from your tasks like this:
[TaskName("foobar")]
public class CakeBuilder : Task<CakeMaker>
{
public override void Execute(CakeMaker context)
{
//some codings
PublishMessage(new TaskUpdated{Message = "It's all going fine"));
}
}You probably want to use your own DI container. Fortunately this is easy, you just need to create your own instance resolver:
public class MyInstanceResolver : IInstanceResolver
{
public object Create(Type type)
{
//your container resolve code
}
}And tell your PipelineFactory to use it:
var pipelineFactory = new PipelineFactory();
pipelineFactory.Configure().SetInstanceResolver(new MyInstanceResolver());