private static bool WriteReadOnlyRepository( IndentingTextWriter writer, InterfaceDeclaration declaration, ICollection<string> implementedInterfaces ) { Contract.Requires( writer != null ); Contract.Requires( implementedInterfaces != null ); if ( implementedInterfaces.Contains( declaration.TypeName ) ) return false; implementedInterfaces.Add( declaration.TypeName ); writer.WriteLine( "async Task<IEnumerable<{1}>> {0}.GetAsync( Func<IQueryable<{1}>, IQueryable<{1}>> queryShaper, CancellationToken cancellationToken )", declaration.TypeName, declaration.ArgumentTypeName ); writer.WriteLine( "{" ); writer.Indent(); writer.WriteLine( "return await queryShaper( Set<{0}>() ).ToArrayAsync( cancellationToken ).ConfigureAwait( false );", declaration.ArgumentTypeName ); writer.Unindent(); writer.WriteLine( "}" ); writer.WriteLine(); writer.WriteLine( "async Task<TResult> {0}.GetAsync<TResult>( Func<IQueryable<{1}>, TResult> queryShaper, CancellationToken cancellationToken )", declaration.TypeName, declaration.ArgumentTypeName ); writer.WriteLine( "{" ); writer.Indent(); writer.WriteLine( "return await Task<TResult>.Factory.StartNew( () => queryShaper( Set<{0}>() ), cancellationToken ).ConfigureAwait( false );", declaration.ArgumentTypeName ); writer.Unindent(); writer.WriteLine( "}" ); return true; }
private static bool WriteUnitOfWork( IndentingTextWriter writer, InterfaceDeclaration declaration, ICollection<string> implementedInterfaces ) { Contract.Requires( writer != null ); Contract.Requires( declaration != null ); Contract.Requires( implementedInterfaces != null ); if ( implementedInterfaces.Contains( declaration.TypeName ) ) return false; implementedInterfaces.Add( declaration.TypeName ); writer.WriteLine( "bool {0}.HasPendingChanges", declaration.TypeName ); writer.WriteLine( "{" ); writer.Indent(); writer.WriteLine( "get" ); writer.WriteLine( "{" ); writer.Indent(); writer.WriteLine( "return ChangeTracker.HasChanges();" ); writer.Unindent(); writer.WriteLine( "}" ); writer.Unindent(); writer.WriteLine( "}" ); writer.WriteLine(); writer.WriteLine( "void {0}.RegisterNew( {1} item )", declaration.TypeName, declaration.ArgumentTypeName ); writer.WriteLine( "{" ); writer.Indent(); writer.WriteLine( "Set<{0}>().Add( item );", declaration.ArgumentTypeName ); writer.WriteLine( "OnPropertyChanged( new PropertyChangedEventArgs( \"HasPendingChanges\" ) );" ); writer.Unindent(); writer.WriteLine( "}" ); writer.WriteLine(); writer.WriteLine( "void {0}.RegisterRemoved( {1} item )", declaration.TypeName, declaration.ArgumentTypeName ); writer.WriteLine( "{" ); writer.Indent(); writer.WriteLine( "Set<{0}>().Remove( item );", declaration.ArgumentTypeName ); writer.WriteLine( "OnPropertyChanged( new PropertyChangedEventArgs( \"HasPendingChanges\" ) );" ); writer.Unindent(); writer.WriteLine( "}" ); writer.WriteLine(); writer.WriteLine( "void {0}.RegisterChanged( {1} item )", declaration.TypeName, declaration.ArgumentTypeName ); writer.WriteLine( "{" ); writer.Indent(); writer.WriteLine( "if ( Entry( item ).State != EntityState.Detached )" ); writer.Indent(); writer.WriteLine( "return;" ); writer.Unindent(); writer.WriteLine(); writer.WriteLine( "Set<{0}>().Attach( item );", declaration.ArgumentTypeName ); writer.WriteLine( "Entry( item ).State = EntityState.Modified;" ); writer.WriteLine( "OnPropertyChanged( new PropertyChangedEventArgs( \"HasPendingChanges\" ) );" ); writer.Unindent(); writer.WriteLine( "}" ); writer.WriteLine(); writer.WriteLine( "void {0}.Unregister( {1} item )", declaration.TypeName, declaration.ArgumentTypeName ); writer.WriteLine( "{" ); writer.Indent(); writer.WriteLine( "Entry( item ).State = EntityState.Detached;" ); writer.WriteLine( "OnPropertyChanged( new PropertyChangedEventArgs( \"HasPendingChanges\" ) );" ); writer.Unindent(); writer.WriteLine( "}" ); writer.WriteLine(); writer.WriteLine( "void {0}.Rollback()", declaration.TypeName ); writer.WriteLine( "{" ); writer.Indent(); writer.WriteLine( "foreach ( var entry in ChangeTracker.Entries<{0}>() )", declaration.ArgumentTypeName ); writer.WriteLine( "{" ); writer.Indent(); writer.WriteLine( "switch ( entry.State )" ); writer.WriteLine( "{" ); writer.Indent(); writer.WriteLine( "case EntityState.Modified:" ); writer.WriteLine( "case EntityState.Deleted:" ); writer.Indent(); writer.WriteLine( "entry.CurrentValues.SetValues( entry.OriginalValues );" ); writer.WriteLine( "entry.State = EntityState.Unchanged;" ); writer.WriteLine( "break;" ); writer.Unindent(); writer.WriteLine( "case EntityState.Added:" ); writer.Indent(); writer.WriteLine( "entry.State = EntityState.Detached;" ); writer.WriteLine( "break;" ); writer.Unindent(); writer.Unindent(); writer.WriteLine( "}" ); writer.Unindent(); writer.WriteLine( "}" ); writer.WriteLine(); writer.WriteLine( "OnPropertyChanged( new PropertyChangedEventArgs( \"HasPendingChanges\" ) );" ); writer.Unindent(); writer.WriteLine( "}" ); writer.WriteLine(); writer.WriteLine( "async Task {0}.CommitAsync( CancellationToken cancellationToken )", declaration.TypeName ); writer.WriteLine( "{" ); writer.Indent(); writer.WriteLine( "await SaveChangesAsync( cancellationToken ).ConfigureAwait( false );" ); writer.WriteLine( "OnPropertyChanged( new PropertyChangedEventArgs( \"HasPendingChanges\" ) );" ); writer.Unindent(); writer.WriteLine( "}" ); return true; }
private static void WriteEndClass( IndentingTextWriter writer, bool hasNamespace ) { Contract.Requires( writer != null ); if ( hasNamespace ) { writer.Unindent(); writer.WriteLine( "}" ); } writer.Unindent(); writer.Write( "}" ); }