Pipeline Pattern is helpful in dividing the problem into smaller reusable code components. This is a simple yet powerful structural pattern to organize a complex logic into smaller reusable components, which can be added/removed/modified independently.
- The logic is complex.
- The simplicity and readability of the code is critical.
- The logic can be divided into multiple modules.
- The modules are potentially reusable for different usecases.
Common solution for pipeline processing
You can install CommandPipeline via NuGet:
Install-Package CommandPipelineInstall it if you want to use Ninject as dependencies resolver for commands
You can install CommandPipeline.Ninject via NuGet:
Install-Package CommandPipeline.NinjectThe complete ready-to-use example is available in the CommandPipeline.Example project
publicclassExtractHtmlFromUrl:NonParameterizedCommand{publicOutArgument<HtmlDocument>HtmlPage{get;set;}publicInArgument<Request>Request{get;set;}publicIWebPageDownloaderDownloader{get;privateset;}publicExtractHtmlFromUrl(IWebPageDownloaderdownloader){this.Downloader=downloader;}publicoverridevoidExecute(){varrequest=Ensure.That(this.Request,"Request").Is(p =>p.IsNotNull());varwebPage=this.Downloader.DownloadWebPage(request.Url);varhtmlPage=newHtmlDocument{Content=webPage};this.HtmlPage.Set(htmlPage);}}varcontainer=newNinjectContainer();container.Bind<IWebPageDownloader>().To<WebPageDownloader>();container.Bind<IMarkdownConveter>().To<MarkdownConveter>();container.Bind<IDataContainerService>().To<DataContainerServiceFake>();varcontext=newParametersContext<ICommand>();context.Set<ExtractHtmlFromUrl,Request>(x =>x.Request,newRequest{Url=link});builder=newPipelineBuilder()
var pipeline = builder.Create(container,context).Register<ExtractHtmlFromUrl>().Register<ConvertHtmlToMardown>().Register<UploadToDataContainer>();pipeline.Handle();