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); }
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) ); }
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) ); }
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) ); }
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); }
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); }
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) ); }
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); }
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);
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); } }
public void BindFields(TypeBindingBuilder <Source, Target> builder) { throw new NotImplementedException(); }
public void BindFields(TypeBindingBuilder <TFrom, TTo> builder) { _bindingDelegate(builder); }