private static ContainerBuilder BindType <TService, TImplementation>(ContainerBuilder builder, Action <IBindingBuilder> composeAction)
        {
            TypeInfo serviceType        = typeof(TService).GetTypeInfo();
            TypeInfo implementationType = typeof(TImplementation).GetTypeInfo();

            if (serviceType.IsGenericTypeDefinition)
            {
                if (!implementationType.IsGenericTypeDefinition ||
                    serviceType.GetGenericArguments().Length != implementationType.GetGenericArguments().Length)
                {
                    throw new BindingInvalidException("Generic service types must have a generic implementation with matching argument count.");
                }

                IGenericBindingBuilder <TService> genericBindingBuilder = new GenericTypeBindingBuilder <TService, TImplementation>(builder);

                composeAction?.Invoke(genericBindingBuilder);

                builder.WithGenericBindingBuilder(genericBindingBuilder);
            }
            else
            {
                IBindingBuilder bindingBuilder = new TypeBindingBuilder <TService, TImplementation>(builder);

                composeAction?.Invoke(bindingBuilder);

                builder.WithBindingBuilder(bindingBuilder);
            }

            return(builder);
        }
Пример #2
0
        public void Binding_Field_With_Binding_Ignores_Previously_Bound_Fields()
        {
            var flatBinding = new TypeBindingBuilder <SourceFlat, TargetFlat>()
                              .Bind(t => t.StringType, s => s.ValueType, s => s.ToString())
                              .BuildBinding();

            var binding = new TypeBindingBuilder <Source, Target>()
                          .Bind(t => t.Flat.StringType, s => s.StringType)
                          .Bind(t => t.Flat, s => s.Flat, flatBinding)
                          .BuildBinding();

            Assert.IsTrue(
                ContainsBinding(new[] {
                nameof(Source.StringType)
            }, new[] {
                nameof(Target.Flat), nameof(TargetFlat.StringType)
            },
                                binding)
                );

            Assert.IsFalse(
                ContainsBinding(new[] {
                nameof(Source.Flat), nameof(SourceFlat.ValueType)
            }, new[] {
                nameof(Target.Flat), nameof(TargetFlat.StringType)
            },
                                binding)
                );
        }
Пример #3
0
        public void AutoBind_Binds_String_Types()
        {
            var builder = new TypeBindingBuilder(typeof(Source), typeof(Target));
            var binding = builder.AutoBind().BuildBinding();

            Assert.IsTrue(
                ContainsBinding(new[] { nameof(Source.StringType) }, new[] { nameof(Target.StringType) }, binding)
                );
        }
Пример #4
0
        public void Bind_Property_With_Expression_Binds()
        {
            var builder = new TypeBindingBuilder <Source, Target>();
            var binding = builder.Bind(t => t.Nested.StringType, s => s.Nested.StringType).BuildBinding();

            Assert.IsTrue(
                ContainsBinding(new[] {
                nameof(Source.Nested), nameof(Source.StringType)
            }, new[] {
                nameof(Target.Nested), nameof(Target.StringType)
            },
                                binding)
                );
        }
Пример #5
0
        public void Can_Map_Top_Value_To_Deep_Value_Between_Objects()
        {
            var mapping = new TypeBindingBuilder <Source, Target>()
                          .Bind(t => t.Nested.FlatValue, s => s.FlatValue)
                          .BuildBinding()
                          .BuildMapping();

            var source = new Source {
                FlatValue = "Hello World"
            };
            var target = new Target();

            var sourceReader = new ObjectDataModelReader <Source>(source);
            var targetWriter = new ObjectDataModelWriter <Target>(target);

            mapping.Run(sourceReader, targetWriter);

            Assert.AreEqual(source.FlatValue, target.Nested.FlatValue);
        }
Пример #6
0
        public void Converts_Field_Values()
        {
            var mapping = new TypeBindingBuilder <Source, Target>()
                          .Bind(t => t.ValueType, s => s.ValueType, value => value + 10)
                          .BuildBinding()
                          .BuildMapping();

            var source = new Source {
                ValueType = 10
            };
            var target = new Target();

            var sourceReader = new ObjectDataModelReader <Source>(source);
            var targetWriter = new ObjectDataModelWriter <Target>(target);

            mapping.Run(sourceReader, targetWriter);

            Assert.AreEqual(source.ValueType + 10, target.ValueType);
        }
Пример #7
0
        public void AutoBind_Uses_Existing_Binding()
        {
            var flatBinding = new TypeBindingBuilder <SourceFlat, TargetFlat>()
                              .Bind(t => t.StringType, s => s.ValueType, s => s.ToString())
                              .BuildBinding();

            var binding = new TypeBindingBuilder <Source, Target>()
                          .AutoBind(new[] { flatBinding })
                          .BuildBinding();

            Assert.IsTrue(
                ContainsBinding(new[] {
                nameof(Source.Flat), nameof(SourceFlat.ValueType)
            }, new[] {
                nameof(Target.Flat), nameof(TargetFlat.StringType)
            },
                                binding)
                );
        }
Пример #8
0
        public void Can_Map_With_Nulls_And_Leave_Defaults()
        {
            var mapping = new TypeBindingBuilder <Source, Target>()
                          .Bind(t => t.Nested.FlatValue, s => s.Nested.FlatValue) // will be null when mapped
                          .Bind(t => t.ValueType, s => s.ValueType)               // will be mapped after the null is hit
                          .BuildBinding()
                          .BuildMapping();

            var source = new Source {
                ValueType = 5
            };
            var target = new Target();

            var sourceReader = new ObjectDataModelReader <Source>(source);
            var targetWriter = new ObjectDataModelWriter <Target>(target);

            mapping.Run(sourceReader, targetWriter);

            Assert.IsNull(target.Nested);
            Assert.AreEqual(source.ValueType, target.ValueType);
        }
Пример #9
0
        public void Ignores_Conversion_Failure()
        {
            var mapping = new TypeBindingBuilder <Source, Target>()
                          .Bind(
                t => t.ValueType,
                s => s.ValueType,
                (int @in, out int @out) => { @out = @in; return(false); }
                )
                          .BuildBinding()
                          .BuildMapping();

            var source = new Source {
                ValueType = 10
            };
            var target = new Target();

            var sourceReader = new ObjectDataModelReader <Source>(source);
            var targetWriter = new ObjectDataModelWriter <Target>(target);

            mapping.Run(sourceReader, targetWriter);

            Assert.AreEqual(default, target.ValueType);
Пример #10
0
        public void Can_Select_Bound_Complex_Type_With_Transform()
        {
            var schema = new DataSchemaBuilder()
                         .AddSqlEntity <Has_Complex_Type>()
                         .Build();
            var sqlDataModel = schema.Sql.SqlEntities.OfType <SqlDataModel <Has_Complex_Type> >().First();

            using (var dataProvider = DataProvider.CreateTestProvider())
            {
                dataProvider.ExecuteNonQuery(Sqlite3QueryExpression.Raw($@"
					CREATE TABLE {sqlDataModel.StorageModel.DefaultTableName}
					(
						[Complex_A] INTEGER,
						[Complex_B] INTEGER
					)"                    ));

                var a = 2;
                var b = 4;

                dataProvider.ExecuteNonQuery(QueryExpression.Insert(
                                                 QueryExpression.Table(sqlDataModel.StorageModel.DefaultTableName),
                                                 new[] { QueryExpression.Column("Complex_A"), QueryExpression.Column("Complex_B") },
                                                 new[] { QueryExpression.Value(a), QueryExpression.Value(b) }
                                                 ));

                var binding = new TypeBindingBuilder <Has_Complex_Type, Custom_View>()
                              .Bind(q => q.Sum, q => q.Complex, o => o.A + o.B)
                              .Bind(q => q.Product, q => q.Complex, o => o.A * o.B)
                              .BuildBinding();

                var dataSet = new SqlDataSet <Has_Complex_Type>(sqlDataModel, dataProvider);
                var result  = dataSet.Select <Custom_View>(binding).ToSingle();

                Assert.AreEqual(a + b, result.Sum);
                Assert.AreEqual(a * b, result.Product);
            }
        }
Пример #11
0
 public void BindFields(TypeBindingBuilder <Source, Target> builder)
 {
     throw new NotImplementedException();
 }
Пример #12
0
 public void BindFields(TypeBindingBuilder <TFrom, TTo> builder)
 {
     _bindingDelegate(builder);
 }