Example #1
0
        /// <summary>
        /// Return a Lazy of CloudTable that will fetch the table reference, honoring any configured TableNamePrefix
        /// and auto-create if not exist.
        /// </summary>
        /// <param name="tableNameFunc">Needs to be a func instead of direct access to virtual because this is wired up (into Lazy objects)
        /// in the constructor where virtual calls are troublesome.</param>
        /// <returns></returns>
        public Lazy <CloudTable> RegisterTableForEntityType <TEntity>(Func <string> tableNameFunc)
        {
            if (!_tableByEntityType.TryGetValue(typeof(TEntity), out Lazy <CloudTable> result))
            {
                lock (_guard)
                {
                    if (!_tableByEntityType.TryGetValue(typeof(TEntity), out result))
                    {
                        result = new Lazy <CloudTable>(() =>
                        {
                            var tableName = ApplyTableNamePrefix(tableNameFunc());
                            var table     = Client.GetTableReference(tableName);
                            table.CreateIfNotExists();

                            if (!_storeWriterByTableName.TryGetValue(tableName, out IStoreWriter storeWriter))
                            {
                                lock (_guard)
                                {
                                    if (!_storeWriterByTableName.TryGetValue(tableName, out storeWriter))
                                    {
                                        storeWriter = _storeFactory.GetStoreWriter(table);
                                        _storeWriterByTableName[tableName] = storeWriter;
                                        _unitOfWork.RegisterStoreFor <TEntity>(storeWriter);
                                    }
                                }
                            }
                            return(table);
                        });

                        _tableByEntityType[typeof(TEntity)] = result;
                    }
                }
            }
            return(result);
        }