|
using System;
using System.Collections.Generic;
using System.Linq;
using BarbarianIOC.Enums;
using System.Reflection;
using System.Linq.Expressions;
using BarbarianIOC.Exceptions;
namespace BarbarianIOC.Registration
{
public class Component
{
private ComponentRegistration componentRegistration;
public Component For<TCOMP>()
{
componentRegistration = new ComponentRegistration(typeof(TCOMP));
return this;
}
public Component ServiceFor<TInt, TCOMP>()
{
componentRegistration = new ComponentRegistration(typeof(TInt), typeof(TCOMP));
return this;
}
public Component DependsOn<T>(T dependencies)
{
if (componentRegistration == null)
{
throw new ContainerConfigurationException(
"Configuration error DependsOn<> MUST be called after For<> or ImplementedBy<>");
}
else
{
List<ConstructorParameterDependency> constructorDependencies = new List<ConstructorParameterDependency>();
foreach (string name in typeof(T).GetConstructors()[0].GetParameters()
.Select(p => p.Name))
{
PropertyInfo property = typeof(T).GetProperty(name);
ParameterExpression param = Expression.Parameter(typeof(T), "x");
Expression propertyAccess = Expression.Property(param, property);
Expression convert = Expression.Convert(propertyAccess, typeof(object));
Func<T, object> lambda = Expression.Lambda<Func<T, object>>(convert, param).Compile();
var result = lambda(dependencies);
constructorDependencies.Add(new ConstructorParameterDependency(
property.PropertyType, name, Expression.Constant(result)));
}
if (constructorDependencies.Any())
{
componentRegistration.HasManualConstructorParameters = true;
componentRegistration.DependsOnValues = constructorDependencies;
}
else
{
componentRegistration.HasManualConstructorParameters = false;
}
return this;
}
}
public ComponentRegistration WithInstanceMode(InstanceMode instanceMode)
{
if (componentRegistration == null)
{
throw new ContainerConfigurationException("Configuration error WithInstanceMode<> MUST be last");
}
else
{
componentRegistration.InstanceMode = instanceMode;
return componentRegistration;
}
}
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
I currently hold the following qualifications (amongst others, I also studied Music Technology and Electronics, for my sins)
- MSc (Passed with distinctions), in Information Technology for E-Commerce
- BSc Hons (1st class) in Computer Science & Artificial Intelligence
Both of these at Sussex University UK.
Award(s)
I am lucky enough to have won a few awards for Zany Crazy code articles over the years
- Microsoft C# MVP 2016
- Codeproject MVP 2016
- Microsoft C# MVP 2015
- Codeproject MVP 2015
- Microsoft C# MVP 2014
- Codeproject MVP 2014
- Microsoft C# MVP 2013
- Codeproject MVP 2013
- Microsoft C# MVP 2012
- Codeproject MVP 2012
- Microsoft C# MVP 2011
- Codeproject MVP 2011
- Microsoft C# MVP 2010
- Codeproject MVP 2010
- Microsoft C# MVP 2009
- Codeproject MVP 2009
- Microsoft C# MVP 2008
- Codeproject MVP 2008
- And numerous codeproject awards which you can see over at my blog