public MultitenantRepository(ISqlConnectionProvider connectionProvider, IMtTypeStorageProvider typeStorageProvider, IMtTypeStorage typeStorage, IMtObjectConverter converter, IMtObjectsStorage mtObjectsStorage) { _connectionProvider = connectionProvider; _typeStorageProvider = typeStorageProvider; _typeStorage = typeStorage; _converter = converter; _mtObjectsStorage = mtObjectsStorage; }
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); }
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); } } }
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); }
public MtTypeDefinition ResolveType(ISqlConnectionProvider connectionProvider, Type clrType, IMtTypeStorageProvider typeStorageProvider, bool storeIfNew) { return(ResolveMtType(connectionProvider, clrType, typeStorageProvider, false, storeIfNew)); }