Dependency injection - aceryan-consulting/aceryansoft.codeflow GitHub Wiki

In the previous section CodeFlowActivity, we have created our first codeflow activity to load customer data and the next step is to use dependency injection.

public class AiCodeFlowWrapper
{
	public void Run()
	{
		var exceptionHandlingMiddleware = new ExceptionHandlingMiddleware();
		var logActivityFilter = new LogActivityFilter();

		var custAndOrderService = new SampleCustomerAndOrderService();
		var loadCustomerActivity = new LoadCustomerActivity(custAndOrderService);

		var aicodeFlow = new CodeFlow();
		aicodeFlow.StartNew(cfg => {
		cfg.WithContext(() => new AiContext())
		.UseMiddleware(exceptionHandlingMiddleware)
		.UseActivityFilter(logActivityFilter);
		})
		.Do(loadCustomerActivity) 
		.Close();

		aicodeFlow.Execute();
	} 
}

Before we begin, we need to remember from the Basic Concepts what is a ServiceResolver.

ServiceResolver A delegate who help resolve required dependencies. The framework use the definition Func<Type, string, object> to let any caller use his preferred Dependency injection framework (Autofac,Ninject,Unity,etc ...).

In this sample, we will use Ninject but once again you are free to use whatever you want.

PM> Install-Package Ninject

Look our code after adding dependency injection logic.

 public class AiCodeFlowWrapper
{
	public void Run()
	{
		var kernel = BuildDiContainer();
		Func<Type, string, object> serviceResolver = (typ, str) => string.IsNullOrEmpty(str)
									   ? kernel.Get(typ) : kernel.Get(typ, str);

		var aicodeFlow = new CodeFlow();
		aicodeFlow.StartNew(cfg => {
			cfg.WithContext(() => new AiContext())
			.UseMiddleware<IExceptionHandlingMiddleware>() // interface IExceptionHandlingMiddleware : ICodeFlowMiddleWare
			.UseActivityFilter<ILogActivityFilter>() // interface ILogActivityFilter : ICodeFlowActivityFilter
		        .WithServiceResolver(serviceResolver);
                })
		.Do<ILoadCustomerActivity>() // interface ILoadCustomerActivity : ICodeFlowActivity
		.Close();

		aicodeFlow.Execute();
	}
	private StandardKernel BuildDiContainer()
	{
		var kernel = new StandardKernel();
		kernel.Bind<IExceptionHandlingMiddleware>().To<ExceptionHandlingMiddleware>();
		kernel.Bind<ILogActivityFilter>().To<LogActivityFilter>();            
		
		kernel.Bind<ICustomerAndOrderService>().To<SampleCustomerAndOrderService>();
		kernel.Bind<ILoadCustomerActivity>().To<LoadCustomerActivity>();

		return kernel;
	}
}

I won't bother you with all the benefits of using dependency injection but if you are new to the concept, please visit dependency injection page on wikipedia

Continue reading: CallCodeFlow