Exemplo n.º 1
0
 public MultitenantRepository(ISqlConnectionProvider connectionProvider, IMtTypeStorageProvider typeStorageProvider, IMtTypeStorage typeStorage, IMtObjectConverter converter, IMtObjectsStorage mtObjectsStorage)
 {
     _connectionProvider  = connectionProvider;
     _typeStorageProvider = typeStorageProvider;
     _typeStorage         = typeStorage;
     _converter           = converter;
     _mtObjectsStorage    = mtObjectsStorage;
 }
Exemplo n.º 2
0
        private MtTypeDefinition BuildMtType(ISqlConnectionProvider connectionProvider, Type clrType, IMtTypeStorageProvider typeStorageProvider, bool forceComplexType)
        {
            if (_typeConverter.IsPrimitiveType(clrType))
            {
                return(MtTypeDefinition.MakePrimitive(Guid.NewGuid(), clrType));
            }

            // forceComplexType is the hack that prevents MT type system from traversing types of complex properties.
            // Instead we mark such properties as 'complex' at later will store them as JSON
            if (forceComplexType)
            {
                return(MtTypeDefinition.MakeComplexType(Guid.NewGuid(), clrType));
            }

            var mtType = MtTypeDefinition.MakeType(Guid.NewGuid(), clrType);
            int propId = 0;

            foreach (var prop in clrType.GetProperties(BindingFlags.Instance | BindingFlags.Public))
            {
                // prevent type parsing for properties: set forceComplexType = true
                var propType = ResolveMtType(connectionProvider, prop.PropertyType, typeStorageProvider, true, true);
                mtType.Properties.Add(new MtPropertyInfo(propId++, prop.Name, mtType, propType));
            }

            return(mtType);
        }
Exemplo n.º 3
0
        private void CacheTypeDependences(ISqlConnectionProvider connectionProvider, MtTypeDefinition typeDefinition, IMtTypeStorageProvider typeStorageProvider)
        {
            if (_clrTypeMappings.ContainsKey(typeDefinition.ClrType))
            {
                return;
            }

            // this type was not saved to the DB yet. Request storage provider to persist this type in storage provider's unit of work scope.
            // this logic shall not create duplicates because storage provider checks if type was alredy persisted before saving.

            if (_isUnsavedType.Contains(typeDefinition.Id))
            {
                typeStorageProvider.PersistType(connectionProvider, typeDefinition);
            }

            _clrTypeMappings[typeDefinition.ClrType] = typeDefinition;

            if (typeDefinition.Properties != null)
            {
                foreach (var mtPropertyInfo in typeDefinition.Properties)
                {
                    CacheTypeDependences(connectionProvider, mtPropertyInfo.MtPropertyType, typeStorageProvider);
                }
            }
        }
Exemplo n.º 4
0
        private MtTypeDefinition ResolveMtType(ISqlConnectionProvider connectionProvider, Type clrType, IMtTypeStorageProvider typeStorageProvider, bool forceComplexType, bool storeIfNew)
        {
            MtTypeDefinition typeDefinition;

            lock (_clrTypeMappings)
            {
                if (!_clrTypeMappings.TryGetValue(clrType, out typeDefinition))
                {
                    if (typeStorageProvider.TryLoadType(connectionProvider, clrType, out typeDefinition))
                    {
                        CacheTypeDependences(connectionProvider, typeDefinition, typeStorageProvider);
                        return(typeDefinition);
                    }

                    if (!storeIfNew)
                    {
                        return(null);
                    }

                    typeDefinition = BuildMtType(connectionProvider, clrType, typeStorageProvider, forceComplexType);
                    typeStorageProvider.PersistType(connectionProvider, typeDefinition);
                    _clrTypeMappings[clrType] = typeDefinition;
                    _isUnsavedType.Add(typeDefinition.Id);
                }
            }

            return(typeDefinition);
        }
Exemplo n.º 5
0
 public MtTypeDefinition ResolveType(ISqlConnectionProvider connectionProvider, Type clrType, IMtTypeStorageProvider typeStorageProvider, bool storeIfNew)
 {
     return(ResolveMtType(connectionProvider, clrType, typeStorageProvider, false, storeIfNew));
 }