Datei: NDODLL/NDOMetaclass.cs
Last Commit (9de9fa9)
			
| 1 | using System; | 
| 2 | using System.Linq; | 
| 3 | using System.Reflection; | 
| 4 | using System.Collections.Generic; | 
| 5 | using System.Text; | 
| 6 | using NDO.Configuration; | 
| 7 | |
| 8 | namespace NDO | 
| 9 | { | 
| 10 | ····/// <summary> | 
| 11 | /// This class overrides the built in Metaclass, generated by the NDOEnhancer, | 
| 12 | ····/// in order to support resolving constructor parameters. | 
| 13 | ····/// </summary> | 
| 14 | class NDOMetaclass : IMetaClass | 
| 15 | ····{ | 
| 16 | ········private readonly Type t; | 
| 17 | ········private readonly IMetaClass innerClass; | 
| 18 | ········private readonly INDOContainer configContainer; | 
| 19 | ········private ConstructorInfo constructor = null; | 
| 20 | ········private bool isDefaultConstructor = false; | 
| 21 | |
| 22 | public NDOMetaclass( Type t, IMetaClass innerClass, INDOContainer configContainer) | 
| 23 | ········{ | 
| 24 | ············this.t = t; | 
| 25 | ············this.innerClass = innerClass; | 
| 26 | ············this.configContainer = configContainer; | 
| 27 | ········} | 
| 28 | |
| 29 | public IPersistenceCapable CreateObject( ) | 
| 30 | ········{ | 
| 31 | if ( isDefaultConstructor) | 
| 32 | ················return innerClass.CreateObject(); | 
| 33 | |
| 34 | ············List<object> parameters = new List<object>(); | 
| 35 | |
| 36 | ············if (this.constructor == null) | 
| 37 | ············{ | 
| 38 | ················var registrations = this.configContainer.Registrations; | 
| 39 | ················foreach (var constr in t.GetConstructors()) | 
| 40 | ················{ | 
| 41 | ····················bool canResolve = true; | 
| 42 | ····················parameters.Clear(); | 
| 43 | ···················· | 
| 44 | ····················foreach (var p in constr.GetParameters()) | 
| 45 | ····················{ | 
| 46 | ························if (!registrations.Any(r=>r.Key == p.ParameterType)) | 
| 47 | ························{ | 
| 48 | ····························canResolve = false; | 
| 49 | ····························break; | 
| 50 | ························} | 
| 51 | ····················} | 
| 52 | |
| 53 | if ( canResolve) | 
| 54 | { | 
| 55 | ························this.constructor = constr; | 
| 56 | ························isDefaultConstructor = constr.GetParameters().Length == 0; | 
| 57 | ························break; | 
| 58 | ····················} | 
| 59 | ················} | 
| 60 | ············} | 
| 61 | |
| 62 | ············if (constructor == null) | 
| 63 | ················throw new NDOException( 116, $"Cant find a resolvable constructor for class '{t.FullName}'" ); | 
| 64 | |
| 65 | ············foreach (var p in this.constructor.GetParameters()) | 
| 66 | ············{ | 
| 67 | ················var o = this.configContainer.Resolve( p.ParameterType ); | 
| 68 | ················parameters.Add( o ); | 
| 69 | ············} | 
| 70 | |
| 71 | ············return (IPersistenceCapable)this.constructor.Invoke( parameters.ToArray() ); | 
| 72 | ········} | 
| 73 | |
| 74 | ········public int GetRelationOrdinal( string fieldName ) | 
| 75 | ········{ | 
| 76 | ············return innerClass.GetRelationOrdinal( fieldName ); | 
| 77 | ········} | 
| 78 | ····} | 
| 79 | } | 
| 80 | 
New Commit (a99de3b)
			
| 1 | using System; | 
| 2 | using System.Linq; | 
| 3 | using System.Reflection; | 
| 4 | using System.Collections.Generic; | 
| 5 | using System.Text; | 
| 6 | using NDO.Configuration; | 
| 7 | |
| 8 | namespace NDO | 
| 9 | { | 
| 10 | ····/// <summary> | 
| 11 | /// This class wraps the MetaClass generated by old versions of the NDOEnhancer, | 
| 12 | ····/// in order to support resolving constructor parameters. | 
| 13 | ····/// </summary> | 
| 14 | class NDOMetaclass : MetaclassBase | 
| 15 | ····{ | 
| 16 | ········private readonly IMetaClass innerClass; | 
| 17 | |
| 18 | public NDOMetaclass( Type t, IMetaClass innerClass) : base( t) | 
| 19 | ········{ | 
| 20 | ············this.innerClass = innerClass; | 
| 21 | ········} | 
| 22 | |
| 23 | /// <inheritdoc/> | 
| 24 | ········public override IPersistenceCapable CreateObject() | 
| 25 | ········{ | 
| 26 | //if ( IsDefaultConstructor) | 
| 27 | ············return innerClass.CreateObject(); | 
| 28 | //throw new Exception( "Can't use CreateObject( ) if the constructor expects parameters. Use CreateObject( INDOContainer configContainer) instead. " ) ; | 
| 29 | ········} | 
| 30 | |
| 31 | /// <inheritdoc/> | 
| 32 | public override int GetRelationOrdinal( string fieldName ) | 
| 33 | ········{ | 
| 34 | ············return innerClass.GetRelationOrdinal( fieldName ); | 
| 35 | ········} | 
| 36 | ····} | 
| 37 | } | 
| 38 |