main
1using System;
2using System.Collections.Generic;
3using System.Linq.Expressions;
4using gorilla.commons.utility;
5
6namespace MoMoney.boot.container.registration.mapping
7{
8 public class Map<Input, Output> : IMap<Input, Output>
9 {
10 IMapInitializationStep<Output> map_initialization_step;
11 readonly IList<IMappingStep<Input, Output>> mapping_steps;
12 readonly IMappingStepFactory mapping_step_factory;
13
14 public Map() : this(new MappingStepFactory()) {}
15
16 public Map(IMappingStepFactory mapping_step_factory)
17 : this(
18 new MissingInitializationStep<Output>(), new List<IMappingStep<Input, Output>>(), mapping_step_factory) {}
19
20 public Map(IMapInitializationStep<Output> map_initialization_step,
21 IList<IMappingStep<Input, Output>> mapping_steps, IMappingStepFactory mapping_step_factory)
22 {
23 this.map_initialization_step = map_initialization_step;
24 this.mapping_steps = mapping_steps;
25 this.mapping_step_factory = mapping_step_factory;
26 }
27
28 public void add(IMappingStep<Input, Output> step)
29 {
30 mapping_steps.Add(step);
31 }
32
33 public IMap<Input, Output> map<PropertyType>(Expression<Func<Input, PropertyType>> from,
34 Expression<Func<Output, PropertyType>> to)
35 {
36 add(mapping_step_factory.create_mapping_step_for(from, to));
37 return this;
38 }
39
40 public IMap<Input, Output> initialize_mapping_using(Func<Output> initializer_expression)
41 {
42 map_initialization_step = new FuncInitializationStep<Output>(initializer_expression);
43 return this;
44 }
45
46 public Output map_from(Input input)
47 {
48 var output = map_initialization_step.initialize();
49 mapping_steps.each(x => x.map(input, output));
50 return output;
51 }
52 }
53}