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}