IT:AD:ValueInjecter
Example
An example:
public struct TypeKey { private Type _t1; public Type T1 { get { return _t1; } set { _t1 = value; } } private Type _t2; public Type T2 { get { return _t2; } private set { _t2 = value; } } public TypeKey(Type t1, Type t2) { _t1 = t1; _t2 = t2; } }
public interface IConventionMappingService { T2 MapAway<T1, T2>(T1 t1) where T2 : class, new(); T2 MapAway<T1, T2, TConverter>(T1 t1) where T2 : class, new() where TConverter : ConventionInjection, new(); void Register(Type t1, Type t2, ConventionInjection mapping); } public class ConventionMappingService :IConventionMappingService { private Dictionary<TypeKey, ConventionInjection> _conventionInjections = new Dictionary<TypeKey, ConventionInjection>(); public T2 MapAway<T1, T2>(T1 t1) where T2 : class, new() { return new T2().InjectFrom(t1) as T2; } public T2 MapAway<T1, T2, TConverter>(T1 t1) where T2 : class, new() where TConverter : ConventionInjection, new() { return new T2().InjectFrom<TConverter>(t1) as T2; } public void Register(Type t1, Type t2, ConventionInjection mapping) { _conventionInjections[new TypeKey(t1, t2)] = mapping; } }
The MappingService tries to map from one to another based on conventions.
There are built in ones, which is fine for a while, but you can register your own
Conventions
(which the documentation refers to as Injections
).
Here's an example a trivial convention:
//Create a custom Converter, based on ConvetionInjection //specifying a convention based on src and target property names: public class MyConverter : ConventionInjection { protected override bool Match(ConventionInfo c) { return c.SourceProp.Name == "Name" && c.TargetProp.Name == "Title"; // where source prop is "Id" and target prop is Source type name + "_Id" ( Id - Foo_Id; Id - Bar_Id ) } }
See IT:AD:ValueInjecter:HowTo:Convention Examples for more examples.