예제 #1
0
        List <IMemberBinder> CreateMemberBinders(IDbContext dbContext)
        {
            ObjectMemberMapper   mapper        = this.ConstructorDescriptor.GetEntityMemberMapper();
            List <IMemberBinder> memberBinders = new List <IMemberBinder>(this.PrimitiveMembers.Count + this.ComplexMembers.Count + this.CollectionMembers.Count);

            foreach (var kv in this.PrimitiveMembers)
            {
                MRMTuple mrmTuple            = mapper.GetMappingMemberMapper(kv.Key);
                PrimitiveMemberBinder binder = new PrimitiveMemberBinder(kv.Key, mrmTuple, kv.Value);
                memberBinders.Add(binder);
            }

            foreach (var kv in this.ComplexMembers)
            {
                MemberValueSetter   setter         = mapper.GetMemberSetter(kv.Key);
                IObjectActivator    memberActivtor = kv.Value.CreateObjectActivator(dbContext);
                ComplexMemberBinder binder         = new ComplexMemberBinder(setter, memberActivtor);
                memberBinders.Add(binder);
            }

            foreach (var kv in this.CollectionMembers)
            {
                MemberValueSetter      setter         = mapper.GetMemberSetter(kv.Key);
                IObjectActivator       memberActivtor = kv.Value.CreateObjectActivator(dbContext);
                CollectionMemberBinder binder         = new CollectionMemberBinder(setter, memberActivtor);
                memberBinders.Add(binder);
            }

            return(memberBinders);
        }
예제 #2
0
        List <IObjectActivator> CreateArgumentActivators(IDbContext dbContext)
        {
            ParameterInfo[]         parameters         = this.ConstructorDescriptor.ConstructorInfo.GetParameters();
            List <IObjectActivator> argumentActivators = new List <IObjectActivator>(parameters.Length);

            for (int i = 0; i < parameters.Length; i++)
            {
                IObjectActivator argumentActivator = null;
                ParameterInfo    parameter         = parameters[i];
                if (this.ConstructorParameters.TryGetValue(parameter, out int ordinal))
                {
                    argumentActivator = new PrimitiveObjectActivator(parameter.ParameterType, ordinal);
                }
                else if (this.ConstructorComplexParameters.TryGetValue(parameter, out IObjectActivatorCreator argumentActivatorCreator))
                {
                    argumentActivator = argumentActivatorCreator.CreateObjectActivator(dbContext);
                }
                else
                {
                    throw new UnbelievableException();
                }

                argumentActivators.Add(argumentActivator);
            }

            return(argumentActivators);
        }
        public static void CleanUp()
        {
            Lock();
            try
            {
                ScriptNET.Ast.ScriptExpr.HandleOperator -= HandleOperator;
                Handlers.Clear();
                initializingTypes.Clear();
                Binder       = null;
                Activator    = null;
                ScopeFactory = null;
                if (AssemblyManager != null)
                {
                    AssemblyManager.Dispose();
                }
                AssemblyManager = null;
                SettingsItems.Clear();
                BinOperators.Clear();
                UnaryOperators.Clear();
                InitializationScript = null;

                Configuration = new ScriptConfiguration();
            }
            finally
            {
                UnLock();
            }
        }
예제 #4
0
 public CollectionObjectFitter(IObjectActivator elementActivator, IEntityRowComparer entityRowComparer, IFitter elementFitter, PropertyDescriptor elementOwnerProperty)
 {
     this._elementActivator     = elementActivator;
     this._entityRowComparer    = entityRowComparer;
     this._elementFitter        = elementFitter;
     this._elementOwnerProperty = elementOwnerProperty;
 }
예제 #5
0
        public IObjectActivator Next()
        {
            IObjectActivator ret = this._objectActivators[this._next];

            this._next++;
            return(ret);
        }
예제 #6
0
        public object CreateObjectAsSingle(Type type, params object[] args)
        {
            var key = type.Name;

            if (container.ContainsKey(key))
            {
                return(container[key]);
            }

            IObjectActivator activator = null;

            if (!objectActivators.ContainsKey(key))
            {
                var argsType = Array.ConvertAll(args, x => x.GetType());
                activator = CreateActivator(type, argsType);
                objectActivators.Add(key, activator);
            }
            else
            {
                activator = objectActivators[key];
            }

            var obj = activator.Create(args);

            container.Add(key, obj);

            return(obj);
        }
예제 #7
0
        async BoolResultTask MoveNext(bool @async)
        {
            if (this._disposed)
            {
                return(false);
            }

            bool nextResult = @async ? await this._dataReaderEnumerator.MoveNextAsync() : this._dataReaderEnumerator.MoveNext();

            if (nextResult)
            {
                if (this._objectActivator == null)
                {
                    this._objectActivator = this._objectActivatorCreator(this._dataReaderEnumerator.Current);
                }

                this._current = (T)(await this._objectActivator.CreateInstance(this._dataReaderEnumerator.Current, @async));
            }
            else
            {
                this._current = default;
            }

            return(nextResult);
        }
예제 #8
0
            public QueryEnumerator(InternalSqlQuery <T> internalSqlQuery)
            {
                this._internalSqlQuery = internalSqlQuery;
                this._reader           = null;
                this._objectActivator  = null;

                this._current     = default(T);
                this._hasFinished = false;
                this._disposed    = false;
            }
예제 #9
0
        static IDataReader DataReaderReady(IDataReader dataReader, IObjectActivator objectActivator)
        {
            if (objectActivator is RootEntityActivator)
            {
                dataReader = new QueryDataReader(dataReader);
            }

            objectActivator.Prepare(dataReader);

            return(dataReader);
        }
예제 #10
0
        public QueryEnumerator(DbCommandFactor commandFactor, Func <DbCommandFactor, bool, Task <IDataReader> > dataReaderGetter)
        {
            this._commandFactor    = commandFactor;
            this._dataReaderGetter = dataReaderGetter;
            this._objectActivator  = commandFactor.ObjectActivator;

            this._reader = null;

            this._current     = default(T);
            this._hasFinished = false;
            this._disposed    = false;
        }
            public QueryEnumerator(InternalAdoSession adoSession, DbCommandFactor commandFactor)
            {
                this._adoSession      = adoSession;
                this._commandFactor   = commandFactor;
                this._objectActivator = commandFactor.ObjectActivator;

                this._reader = null;

                this._current     = default(T);
                this._hasFinished = false;
                this._disposed    = false;
            }
예제 #12
0
 public void Prepare(IDataReader reader)
 {
     for (int i = 0; i < this._argumentActivators.Count; i++)
     {
         IObjectActivator argumentActivator = this._argumentActivators[i];
         argumentActivator.Prepare(reader);
     }
     for (int i = 0; i < this._memberBinders.Count; i++)
     {
         IMemberBinder binder = this._memberBinders[i];
         binder.Prepare(reader);
     }
 }
예제 #13
0
            void Prepare()
            {
                Type type = typeof(T);

                if (Utils.IsMapType(type))
                {
                    MappingField mf = new MappingField(type, 0);
                    this._objectActivator = mf.CreateObjectActivator();
                    this._reader          = this.ExecuteReader();
                    return;
                }

                this._reader          = this.ExecuteReader();
                this._objectActivator = GetObjectActivator(type, this._reader);
            }
예제 #14
0
            void Prepare()
            {
                Type type = typeof(T);

                if (Utils.IsMapType(type))
                {
                    MappingField mf = new MappingField(type, 0);
                    this._objectActivator = mf.CreateObjectActivator();
                    this._reader          = this._internalSqlQuery._dbContext.InnerDbSession.ExecuteReader(this._internalSqlQuery._sql, this._internalSqlQuery._parameters, CommandBehavior.Default, CommandType.Text);
                    return;
                }

                this._reader          = this._internalSqlQuery._dbContext.InnerDbSession.ExecuteReader(this._internalSqlQuery._sql, this._internalSqlQuery._parameters, CommandBehavior.Default, CommandType.Text);
                this._objectActivator = GetObjectActivator(type, this._reader);
            }
예제 #15
0
            void Prepare()
            {
                Type type = typeof(T);

                if (type != UtilConstants.TypeOfObject && MappingTypeSystem.IsMappingType(type))
                {
                    MappingField mf = new MappingField(type, 0);
                    this._objectActivator = mf.CreateObjectActivator();
                    this._reader          = this.ExecuteReader();
                    return;
                }

                this._reader          = this.ExecuteReader();
                this._objectActivator = GetObjectActivator(type, this._reader);
            }
예제 #16
0
            void Prepare()
            {
                Type type = typeof(T);

                if (type != PublicConstants.TypeOfObject && MappingTypeSystem.IsMappingType(type))
                {
                    PrimitiveObjectActivatorCreator activatorCreator = new PrimitiveObjectActivatorCreator(type, 0);
                    this._objectActivator = activatorCreator.CreateObjectActivator();
                    this._reader          = this.ExecuteReader();
                    return;
                }

                this._reader          = this.ExecuteReader();
                this._objectActivator = GetObjectActivator(type, this._reader);
            }
        public static void Initialize(Stream configuration)
        {
            Lock();
            try
            {
                LoadConfiguration(configuration);

                if (Binder == null)
                {
                    Binder = new DefaultBinder();
                }

                if (Activator == null)
                {
                    Activator = new DefaultActivator();
                }

                InitializeSettingItems();
                RegisterOperators();

                if (ScopeFactory == null)
                {
                    ScopeFactory = Activator.CreateInstance(GetNativeType(GetSettingsItem <string>(ConfigSchema.ScopeFactoryAttribute))) as IScopeFactory;
                }
                RegisterScopes();

                if (AssemblyManager == null)
                {
                    AssemblyManager = new DefaultAssemblyManager();
                }
                OnInitializingTypes(AssemblyManager);
                AssemblyManager.Initialize(Configuration);

                if (!string.IsNullOrEmpty(Configuration.Initialization))
                {
                    InitializationScript = Script.Compile(Configuration.Initialization);
                }

                RegisterOperatorHandler("+=", new EventOperatorHandler(true));
                RegisterOperatorHandler("-=", new EventOperatorHandler(false));

                ScriptNET.Ast.ScriptExpr.HandleOperator += HandleOperator;
            }
            finally
            {
                UnLock();
            }
        }
예제 #18
0
        public IObjectActivator CreateObjectActivator(IDbContext dbContext)
        {
            EntityMemberMapper  mapper        = this.ConstructorDescriptor.GetEntityMemberMapper();
            List <IValueSetter> memberSetters = new List <IValueSetter>(this.Members.Count + this.EntityMembers.Count);

            foreach (var kv in this.Members)
            {
                IMRM mMapper = mapper.TryGetMappingMemberMapper(kv.Key);
                MappingMemberBinder binder = new MappingMemberBinder(mMapper, kv.Value);
                memberSetters.Add(binder);
            }

            foreach (var kv in this.EntityMembers)
            {
                Action <object, object> del            = mapper.TryGetNavigationMemberSetter(kv.Key);
                IObjectActivator        memberActivtor = kv.Value.CreateObjectActivator();
                NavigationMemberBinder  binder         = new NavigationMemberBinder(del, memberActivtor);
                memberSetters.Add(binder);
            }

            Func <IDataReader, ReaderOrdinalEnumerator, ObjectActivatorEnumerator, object> instanceCreator = this.ConstructorDescriptor.GetInstanceCreator();

            List <int> readerOrdinals = this.ConstructorParameters.Select(a => a.Value).ToList();
            List <IObjectActivator> objectActivators = this.ConstructorEntityParameters.Select(a => a.Value.CreateObjectActivator()).ToList();

            ObjectActivator ret;

            if (dbContext != null)
            {
                ret = new ObjectActivatorWithTracking(instanceCreator, readerOrdinals, objectActivators, memberSetters, this.CheckNullOrdinal, dbContext);
            }
            else
            {
                ret = new ObjectActivator(instanceCreator, readerOrdinals, objectActivators, memberSetters, this.CheckNullOrdinal);
            }

            return(ret);
        }
예제 #19
0
 public QueryEnumerator(Func <bool, Task <IDataReader> > dataReaderCreator, IObjectActivator objectActivator) : this(dataReaderCreator, dataReader => objectActivator)
 {
 }
예제 #20
0
 public DbCommandFactor(IObjectActivator objectActivator, string commandText, DbParam[] parameters)
 {
     this.ObjectActivator = objectActivator;
     this.CommandText     = commandText;
     this.Parameters      = parameters;
 }
예제 #21
0
 public static object CreateInstance(this IObjectActivator activator, IScriptContext context, IObjectBind bind)
 {
     return(activator.CreateInstance(null, bind));
 }
예제 #22
0
 public RootEntityActivator(IObjectActivator entityActivator, IFitter fitter, IEntityRowComparer entityRowComparer)
 {
     this._entityActivator   = entityActivator;
     this._fitter            = fitter;
     this._entityRowComparer = entityRowComparer;
 }
예제 #23
0
 public Factory(IObjectActivator objectActivator) : base(objectActivator)
 {
 }
예제 #24
0
 public static object CreateInstance(this IObjectActivator activator, Type type)
 {
     return(activator.CreateInstance(type, null));
 }
예제 #25
0
 public ComplexMemberBinder(Action <object, object> setter, IObjectActivator activtor)
 {
     this._setter   = setter;
     this._activtor = activtor;
 }
예제 #26
0
 public DbCommandFactor(IObjectActivator objectActivator, string commandText, DbParam[] parameters)
 {
     this.ObjectActivator = objectActivator;
     this.CommandText = commandText;
     this.Parameters = parameters;
 }
예제 #27
0
 public static T CreateInstance <T>(this IObjectActivator activator)
 {
     return((T)CreateInstance(activator, typeof(T)));
 }
예제 #28
0
 public ComplexMemberBinder(MemberValueSetter setter, IObjectActivator activtor) : base(setter, activtor)
 {
 }
예제 #29
0
 public static T CreateInstance <T>(this IObjectActivator activator, object[] args)
 {
     return((T)activator.CreateInstance(typeof(T), args));
 }
예제 #30
0
 public static T Activate <T>(this IObjectActivator activator, Func <string, Type, object> argumentGetter)
 {
     return((T)activator.Activate(typeof(T), argumentGetter));
 }
예제 #31
0
 public ModelBinder(IObjectActivator activator)
 {
     _activator = activator;
 }