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