Changes in / [728eb31:806f4ee]
- Location:
- src
- Files:
-
- 4 added
- 22 deleted
- 27 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Clients/Angular/finki-chattery/src/app/core/state/question-facade.service.ts
r728eb31 r806f4ee 2 2 import { Injectable } from '@angular/core'; 3 3 import { Action, Store } from '@ngrx/store'; 4 import { Observable, Subject } from 'rxjs';5 import { filter} from 'rxjs/operators';4 import { Observable, Subject, throwError } from 'rxjs'; 5 import { catchError, filter, map } from 'rxjs/operators'; 6 6 7 7 import { … … 9 9 PreviewQuestionViewModel, 10 10 QuestionStateViewModel, 11 SearchQuestionsQueryViewModel, 12 VoteType 11 SearchQuestionsQueryViewModel 13 12 } from 'src/app/shared-app/models'; 14 13 import { … … 17 16 GetPreviewQuestionsPopular, 18 17 GetQuestionState, 19 GetSearchQuestions, 20 VoteAnswer 18 GetSearchQuestions 21 19 } from './question-state/question.actions'; 22 20 import { questionStateQuery } from './question-state/question.selectors'; … … 32 30 33 31 constructor(private store: Store<QuestionState>) { 34 this.effectWorking$ = this.store.select(questionStateQuery.effectWorking).pipe(filter((effect) => effect !== null)); 32 this.effectWorking$ = this.store.select(questionStateQuery.effectWorking).pipe( 33 filter((effect) => effect !== null), 34 map((effect) => { 35 if (effect instanceof HttpErrorResponse) { 36 throw effect; 37 } else { 38 return effect; 39 } 40 }), 41 catchError((err) => { 42 return throwError(err); 43 }) 44 ); 35 45 } 36 46 … … 71 81 } 72 82 73 public voteAnswer(answerUid: string, questionUid: string, voteType: VoteType): void {74 this.dispatchEffect(new VoteAnswer(questionUid, answerUid, voteType));75 }76 77 83 public fetchQuestion(questionUid: string): void { 78 84 this.dispatchEffect(new GetQuestionState(questionUid)); -
src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.actions.ts
r728eb31 r806f4ee 2 2 import { Action } from '@ngrx/store'; 3 3 4 import { 5 PreviewQuestionViewModel, 6 QuestionStateViewModel, 7 SearchQuestionsQueryViewModel, 8 VoteAnswerViewModel, 9 VoteType 10 } from 'src/app/shared-app/models'; 4 import { PreviewQuestionViewModel, QuestionStateViewModel, SearchQuestionsQueryViewModel } from 'src/app/shared-app/models'; 11 5 12 6 export enum QuestionActionTypes { … … 19 13 GetSearchQuestions = '[Question] Get search questions', 20 14 GetSearchQuestionsSuccess = '[Question] Get search questions Success', 21 VoteAnswer = '[Question] Vote answer',22 VoteAnswerSuccess = '[Question] Vote answer Success',23 15 EffectStartedWorking = '[Question] Effect Started Working', 24 16 EffectFinishedWorking = '[Question] Effect Finished Working', … … 74 66 } 75 67 76 export class VoteAnswer implements Action {77 readonly type = QuestionActionTypes.VoteAnswer;78 79 constructor(public questionUid: string, public answerUid: string, public voteType: VoteType) {}80 }81 82 export class VoteAnswerSuccess implements Action {83 readonly type = QuestionActionTypes.VoteAnswerSuccess;84 85 constructor(public payload: VoteAnswerViewModel) {}86 }87 88 68 export class EffectStartedWorking implements Action { 89 69 readonly type = QuestionActionTypes.EffectStartedWorking; … … 109 89 | GetPreviewQuestionsPopularSuccess 110 90 | GetSearchQuestionsSuccess 111 | VoteAnswerSuccess112 91 | EffectStartedWorking 113 92 | EffectFinishedWorking -
src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.effects.ts
r728eb31 r806f4ee 7 7 import { BaseApiService } from 'src/app/shared-app/services/base-api.service'; 8 8 import { QuestionFacadeService } from '../question-facade.service'; 9 import { VoteAnswerRequest } from './question-state-request.models'; 10 import { PreviewQuestionResponse, QuestionStateResponse, VoteAnswerResponse } from './question-state-response.models'; 9 import { PreviewQuestionResponse, QuestionStateResponse } from './question-state.models'; 11 10 import { 12 11 EffectFinishedWorking, … … 20 19 GetSearchQuestions, 21 20 GetSearchQuestionsSuccess, 22 QuestionActionTypes, 23 VoteAnswer, 24 VoteAnswerSuccess 21 QuestionActionTypes 25 22 } from './question.actions'; 26 23 import { QuestionMapper } from './question.mapper'; … … 106 103 ); 107 104 }); 108 109 voteAnswer$ = createEffect(() => {110 return this.actions$.pipe(111 ofType<VoteAnswer>(QuestionActionTypes.VoteAnswer),112 mergeMap((action) => {113 const body = new VoteAnswerRequest(action.voteType);114 return this.api.post<VoteAnswerResponse>(`v1/questions/${action.questionUid}/answers/${action.answerUid}/votes`, body).pipe(115 switchMap((state) => [new VoteAnswerSuccess(QuestionMapper.ToVoteAnswerViewModel(state)), new EffectFinishedWorking()]),116 catchError((err) => [new EffectFinishedWorkingError(err)])117 );118 })119 );120 });121 105 } -
src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.mapper.ts
r728eb31 r806f4ee 10 10 QuestionStateViewModel, 11 11 StudentQuestionStateViewModel, 12 TeamQuestionStateViewModel, 13 VoteAnswerViewModel 12 TeamQuestionStateViewModel 14 13 } from 'src/app/shared-app/models'; 15 14 import { TranslateFromJsonService } from 'src/app/shared-app/services'; 16 import { PreviewQuestionResponse, QuestionStateResponse , VoteAnswerResponse } from './question-state-response.models';15 import { PreviewQuestionResponse, QuestionStateResponse } from './question-state.models'; 17 16 18 17 export class QuestionMapper { … … 52 51 x.correctAnswer, 53 52 moment(x.createdOn), 54 x. votesCount,53 x.upvotesCount, 55 54 answerStudent, 56 55 answerResponses … … 114 113 return questions; 115 114 } 116 117 public static ToVoteAnswerViewModel(response: VoteAnswerResponse): VoteAnswerViewModel {118 return new VoteAnswerViewModel(response.answerUid, response.voteUid, response.voteType);119 }120 115 } -
src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.reducers.ts
r728eb31 r806f4ee 1 import { VoteType } from 'src/app/shared-app/models';2 1 import { QuestionAction, QuestionActionTypes } from './question.actions'; 3 2 import { initialState, QuestionState } from './question.state'; … … 26 25 searchQuestionsQuery: action.query 27 26 }; 28 case QuestionActionTypes.VoteAnswerSuccess: {29 if (state.question) {30 return {31 ...state,32 question: {33 ...state.question,34 answers: state.question.answers.map((x) => {35 if (x.uid === action.payload.answerUid) {36 let votesCountNew = x.votesCount;37 38 switch (action.payload.voteType) {39 case VoteType.Upvote:40 votesCountNew++;41 break;42 case VoteType.Downvote:43 votesCountNew--;44 break;45 }46 47 return {48 ...x,49 votesCount: votesCountNew50 };51 }52 53 return x;54 })55 }56 };57 }58 59 return {60 ...state61 };62 }63 27 case QuestionActionTypes.EffectStartedWorking: { 64 28 return { -
src/Clients/Angular/finki-chattery/src/app/shared-app/components/generic/vote/vote.component.ts
r728eb31 r806f4ee 1 1 import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; 2 import { VoteType } from 'src/app/shared-app/models';3 2 import { ButtonType } from '../button/button.models'; 3 4 export enum VoteType { 5 Upvote, 6 Downvote 7 } 4 8 5 9 @Component({ -
src/Clients/Angular/finki-chattery/src/app/shared-app/components/question/question-preview/question-preview.component.html
r728eb31 r806f4ee 14 14 <mat-card-content> 15 15 <div fxLayout="row wrap" fxLayoutAlign="space-around none"> 16 <app-vote 17 [voteCount]="answer.votesCount" 18 [correct]="answer.correctAnswer" 19 (voteClicked)="answerVoted($event, answer.uid, question.uid)" 20 fxFlex="6%" 21 ></app-vote> 16 <app-vote [voteCount]="answer.upvotesCount" [correct]="answer.correctAnswer" fxFlex="6%"></app-vote> 22 17 <div fxFlex="92%"> 23 18 <app-text-editor -
src/Clients/Angular/finki-chattery/src/app/shared-app/components/question/question-preview/question-preview.component.ts
r728eb31 r806f4ee 1 import { HttpErrorResponse } from '@angular/common/http';2 1 import { Component, OnInit } from '@angular/core'; 3 import { NotificationService } from 'src/app/core/services/notification.service';4 2 import { QuestionFacadeService } from 'src/app/core/state/question-facade.service'; 5 3 6 import { QuestionStateViewModel , VoteType} from 'src/app/shared-app/models';4 import { QuestionStateViewModel } from 'src/app/shared-app/models'; 7 5 import { ButtonType } from '../../generic/button/button.models'; 8 6 … … 16 14 working = true; 17 15 ButtonType = ButtonType; 18 constructor(private questionFacade: QuestionFacadeService , private notification: NotificationService) {}16 constructor(private questionFacade: QuestionFacadeService) {} 19 17 20 18 ngOnInit(): void { … … 23 21 this.working = false; 24 22 }); 25 26 this.questionFacade.effectWorking$.subscribe((effect) => {27 if (effect instanceof HttpErrorResponse) {28 this.notification.handleErrorsNotification(effect.error);29 }30 });31 }32 33 answerVoted(voteType: VoteType, answerUid: string, questionUid: string): void {34 this.questionFacade.voteAnswer(answerUid, questionUid, voteType);35 23 } 36 24 } -
src/Clients/Angular/finki-chattery/src/app/shared-app/models/question-state-enums.models.ts
r728eb31 r806f4ee 3 3 Popular 4 4 } 5 6 export enum VoteType {7 Upvote,8 Downvote9 } -
src/Clients/Angular/finki-chattery/src/app/shared-app/models/question-state-view-models.models.ts
r728eb31 r806f4ee 1 import { VoteType } from '.';2 3 1 export class QuestionStateViewModel { 4 2 constructor( … … 34 32 public correctAnswer: boolean, 35 33 public createdOn: moment.Moment, 36 public votesCount: number,34 public upvotesCount: number, 37 35 public student: AnswerStudentQuestionStateViewModel, 38 36 public answerResponses: AnswerResponseQuestionStateViewModel[] … … 75 73 constructor(public text: string) {} 76 74 } 77 78 export class VoteAnswerViewModel {79 constructor(public answerUid: string, public voteUid: string, public voteType: VoteType) {}80 } -
src/Clients/Angular/finki-chattery/src/assets/translations/en.json
r728eb31 r806f4ee 53 53 "ask-question-stepper-ask": "Ask question", 54 54 "ask-question-ask-button-back": "Edit question", 55 "ask-question-ask-button": "Ask question", 56 "AnswerAlreadyUpvoted": "You have already upvoted this answer", 57 "AnswerAlreadyDownvoted": "You have already downvoted this answer", 58 "StudentHasBadReputation": "You have bad reputation and can not vote" 55 "ask-question-ask-button": "Ask question" 59 56 } -
src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/Mapper/QuestionMapper.cs
r728eb31 r806f4ee 54 54 var answerStudent = new AnswerStudentQuestionStateResponse(x.StudentDto.Id, x.StudentDto.Uid, x.StudentDto.Index, x.StudentDto.ImageUrl, x.StudentDto.Reputation); 55 55 56 return new AnswerQuestionStateResponse(x.Id, x.Uid, x.Text, x.CorrectAnswer, x.CreatedOn, x. VotesCount, answerStudent, answerResponses);56 return new AnswerQuestionStateResponse(x.Id, x.Uid, x.Text, x.CorrectAnswer, x.CreatedOn, x.UpvotesCount, answerStudent, answerResponses); 57 57 }); 58 58 } -
src/FinkiChattery/FinkiChattery.Api/Services/RegisterServices.cs
r728eb31 r806f4ee 1 1 using FinkiChattery.Api.ApplicationServices.Authentication; 2 using FinkiChattery.Api.ApplicationServices.Questioning.EventHandlers;3 2 using FinkiChattery.Api.Services; 4 3 using FinkiChattery.Commands.Questioning; … … 32 31 services.AddScoped<IEventService, EventService>(); 33 32 services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ValidationBehavior<,>)); 34 services.AddMediatR(typeof(AskQuestionCommand), typeof(GetQuestionStateQuery) , typeof(UpdateAnswerVotesEventHandler));33 services.AddMediatR(typeof(AskQuestionCommand), typeof(GetQuestionStateQuery)); 35 34 } 36 35 … … 55 54 }); 56 55 services.AddHangfireServer(); 57 58 services.AddScoped<IBackgroundJobClient>(provider =>59 {60 return new BackgroundJobClient(JobStorage.Current);61 });62 56 } 63 57 -
src/FinkiChattery/FinkiChattery.Commands/Questioning/QuestioningErrorCodes.cs
r728eb31 r806f4ee 9 9 public const string CategoriesDontExist = "CategoriesDontExist"; 10 10 public const string TeamDontExist = "TeamDontExist"; 11 public const string AnswerAlreadyUpvoted = "AnswerAlreadyUpvoted";12 public const string AnswerAlreadyDownvoted = "AnswerAlreadyDownvoted";13 public const string StudentHasBadReputation = "StudentHasBadReputation";14 11 } 15 12 } -
src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/CategoriesUidsExist.cs
r728eb31 r806f4ee 1 using FinkiChattery.Persistence.UnitOfWork; 1 using FinkiChattery.Persistence.Repositories; 2 using FinkiChattery.Persistence.UnitOfWork; 2 3 using FluentValidation.Validators; 3 4 using System; -
src/FinkiChattery/FinkiChattery.Contracts/Questioning/GetQuestionState/QuestionStateResponse.cs
r728eb31 r806f4ee 89 89 public class AnswerQuestionStateResponse 90 90 { 91 public AnswerQuestionStateResponse(long id, Guid uid, string text, bool correctAnswer, DateTime createdOn, long votesCount, AnswerStudentQuestionStateResponse studentResponse, IEnumerable<AnswerResponseQuestionStateResponse> answerResponsesResponse)91 public AnswerQuestionStateResponse(long id, Guid uid, string text, bool correctAnswer, DateTime createdOn, long upvotesCount, AnswerStudentQuestionStateResponse studentResponse, IEnumerable<AnswerResponseQuestionStateResponse> answerResponsesResponse) 92 92 { 93 93 Id = id; … … 96 96 CorrectAnswer = correctAnswer; 97 97 CreatedOn = createdOn; 98 VotesCount =votesCount;98 UpvotesCount = upvotesCount; 99 99 StudentResponse = studentResponse; 100 100 AnswerResponsesResponse = answerResponsesResponse; … … 107 107 public bool CorrectAnswer { get; } 108 108 public DateTime CreatedOn { get; } 109 public long VotesCount { get; }109 public long UpvotesCount { get; } 110 110 public AnswerStudentQuestionStateResponse StudentResponse { get; } 111 111 public IEnumerable<AnswerResponseQuestionStateResponse> AnswerResponsesResponse { get; } -
src/FinkiChattery/FinkiChattery.Database/FinkiChattery.Database.sqlproj
r728eb31 r806f4ee 75 75 <Folder Include="dbo\Tables\QuestionCategory" /> 76 76 <Folder Include="Snapshots" /> 77 <Folder Include="dbo\Tables\Vote" />78 77 </ItemGroup> 79 78 <ItemGroup> … … 82 81 <Build Include="dbo\Tables\StudentTeam.sql" /> 83 82 <Build Include="dbo\Tables\TeacherTeam.sql" /> 83 <Build Include="dbo\Tables\Upvote.sql" /> 84 84 <Build Include="dbo\Tables\User\AspNetRoleClaims.sql" /> 85 85 <Build Include="dbo\Tables\User\AspNetRoles.sql" /> … … 100 100 <Build Include="dbo\Tables\QuestionCategory\QuestionCategory.sql" /> 101 101 <None Include="dbo\Tables\QuestionCategory\QuestionCategory.Debug.Seed.sql" /> 102 <Build Include="dbo\Tables\Vote\Vote.sql" />103 102 </ItemGroup> 104 103 <ItemGroup> -
src/FinkiChattery/FinkiChattery.Database/dbo/Tables/Answer/Answer.Debug.Seed.sql
r728eb31 r806f4ee 12 12 (3, N'cee193c3-9d36-4ed8-81b2-15eb4ff305f1', N'Answer 3', 2, 1, 1, GETUTCDATE(), 5), 13 13 (4, N'dee193c3-9d36-4ed8-81b2-15eb4ff305f1', N'Answer 4', 2, 1, 0, GETUTCDATE(), 5) 14 ) AS temp ([Id], [Uid], [Text], [QuestionFk], [StudentFk], [CorrectAnswer], [CreatedOn], [ VotesCount])14 ) AS temp ([Id], [Uid], [Text], [QuestionFk], [StudentFk], [CorrectAnswer], [CreatedOn], [UpvotesCount]) 15 15 ) AS S 16 16 ON T.[ID] = S.[ID] … … 21 21 T.[StudentFk] = S.[StudentFk], 22 22 T.[CorrectAnswer] = S.[CorrectAnswer], 23 T.[ VotesCount] = S.[VotesCount]23 T.[UpvotesCount] = S.[UpvotesCount] 24 24 WHEN NOT MATCHED THEN 25 25 INSERT … … 32 32 [CorrectAnswer], 33 33 [CreatedOn], 34 [ VotesCount]34 [UpvotesCount] 35 35 ) 36 36 VALUES 37 (S.[Id], S.[Uid], S.[Text], S.[QuestionFk], S.[StudentFk], S.[CorrectAnswer], S.[CreatedOn], S.[ VotesCount]);37 (S.[Id], S.[Uid], S.[Text], S.[QuestionFk], S.[StudentFk], S.[CorrectAnswer], S.[CreatedOn], S.[UpvotesCount]); 38 38 SET IDENTITY_INSERT [dbo].[Answer] OFF 39 39 END -
src/FinkiChattery/FinkiChattery.Database/dbo/Tables/Answer/Answer.sql
r728eb31 r806f4ee 7 7 [CorrectAnswer] BIT NOT NULL, 8 8 [CreatedOn] SMALLDATETIME NOT NULL, 9 [ VotesCount] BIGINT NOT NULL DEFAULT 0,9 [UpvotesCount] BIGINT NOT NULL DEFAULT 0, 10 10 CONSTRAINT [PK_Answer] PRIMARY KEY CLUSTERED ([Id] ASC), 11 11 CONSTRAINT [FK_Answer_Question_QuestionFk] FOREIGN KEY ([QuestionFk]) REFERENCES [dbo].[Question] ([Id]), -
src/FinkiChattery/FinkiChattery.Persistence/Configurations/AnswerConfig.cs
r728eb31 r806f4ee 22 22 builder.Property(x => x.CorrectAnswer).HasColumnName(@"CorrectAnswer").HasColumnType("bit").IsRequired(); 23 23 builder.Property(x => x.CreatedOn).HasColumnName(@"CreatedOn").HasColumnType("smalldatetime").IsRequired(); 24 builder.Property(x => x. VotesCount).HasColumnName(@"VotesCount").HasColumnType("bigint").IsRequired().HasDefaultValue(0);24 builder.Property(x => x.UpvotesCount).HasColumnName(@"UpvotesCount").HasColumnType("bigint").IsRequired().HasDefaultValue(0); 25 25 26 26 builder.HasOne(x => x.Question).WithMany(x => x.Answers).HasForeignKey(x => x.QuestionFk).OnDelete(DeleteBehavior.Restrict); -
src/FinkiChattery/FinkiChattery.Persistence/Context/ApplicationDbContext.cs
r728eb31 r806f4ee 23 23 public DbSet<TeacherTeam> TeacherTeams { get; set; } 24 24 public DbSet<Team> Teams { get; set; } 25 public DbSet< Vote> Votes { get; set; }25 public DbSet<Upvote> Upvotes { get; set; } 26 26 27 27 protected override void OnModelCreating(ModelBuilder builder) … … 42 42 builder.ApplyConfiguration(new TeacherTeamConfig(schema)); 43 43 builder.ApplyConfiguration(new TeamConfig(schema)); 44 builder.ApplyConfiguration(new VoteConfig(schema));44 builder.ApplyConfiguration(new UpvoteConfig(schema)); 45 45 } 46 46 } -
src/FinkiChattery/FinkiChattery.Persistence/Models/Answer.cs
r728eb31 r806f4ee 20 20 public DateTime CreatedOn { get; set; } 21 21 22 public long VotesCount { get; set; }22 public long UpvotesCount { get; set; } 23 23 24 public virtual ICollection< Vote> Votes { get; set; }24 public virtual ICollection<Upvote> Upvotes { get; set; } 25 25 26 26 public virtual ICollection<AnswerResponse> AnswerResponses { get; set; } -
src/FinkiChattery/FinkiChattery.Persistence/Models/Student.cs
r728eb31 r806f4ee 1 using System.Collections.Generic; 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 2 6 3 7 namespace FinkiChattery.Persistence.Models … … 18 22 19 23 public virtual ICollection<Question> Questions { get; set; } 20 24 21 25 public virtual ICollection<Answer> Answers { get; set; } 22 26 23 27 public virtual ICollection<StudentTeam> StudentTeams { get; set; } 24 28 } -
src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/Question/QuestionStateDto.cs
r728eb31 r806f4ee 84 84 public class AnswerQuestionStateDto 85 85 { 86 public AnswerQuestionStateDto(long id, Guid uid, string text, bool correctAnswer, DateTime createdOn, long votesCount, AnswerStudentQuestionStateDto studentDto, IEnumerable<AnswerResponseQuestionStateDto> answerResponsesDto)86 public AnswerQuestionStateDto(long id, Guid uid, string text, bool correctAnswer, DateTime createdOn, long upvotesCount, AnswerStudentQuestionStateDto studentDto, IEnumerable<AnswerResponseQuestionStateDto> answerResponsesDto) 87 87 { 88 88 Id = id; … … 91 91 CorrectAnswer = correctAnswer; 92 92 CreatedOn = createdOn; 93 VotesCount =votesCount;93 UpvotesCount = upvotesCount; 94 94 StudentDto = studentDto; 95 95 AnswerResponsesDto = answerResponsesDto; … … 101 101 public bool CorrectAnswer { get; } 102 102 public DateTime CreatedOn { get; } 103 public long VotesCount { get; }103 public long UpvotesCount { get; } 104 104 public AnswerStudentQuestionStateDto StudentDto { get; } 105 105 public IEnumerable<AnswerResponseQuestionStateDto> AnswerResponsesDto { get; } -
src/FinkiChattery/FinkiChattery.Persistence/Repositories/Implementations/QuestionRepo.cs
r728eb31 r806f4ee 80 80 y.CorrectAnswer, 81 81 y.CreatedOn, 82 y. VotesCount,82 y.UpvotesCount, 83 83 new AnswerStudentQuestionStateDto( 84 84 y.Student.Id, -
src/FinkiChattery/FinkiChattery.Persistence/UnitOfWork/Contracts/IUnitOfWork.cs
r728eb31 r806f4ee 11 11 IStudentRepo Students { get; } 12 12 ITeamRepo Teams { get; } 13 IVoteRepo Votes { get; }14 IAnswerRepo Answers { get; }15 13 Task<int> SaveAsync(); 16 14 } -
src/FinkiChattery/FinkiChattery.Persistence/UnitOfWork/Implementations/UnitOfWork.cs
r728eb31 r806f4ee 12 12 private StudentRepo _students; 13 13 private TeamRepo _teams; 14 private VoteRepo _votes;15 private AnswerRepo _answers;16 14 17 15 public UnitOfWork(ApplicationDbContext dbContext) … … 72 70 } 73 71 74 public IVoteRepo Votes75 {76 get77 {78 if (_votes == null)79 {80 _votes = new VoteRepo(DbContext);81 }82 83 return _votes;84 }85 }86 87 public IAnswerRepo Answers88 {89 get90 {91 if (_answers == null)92 {93 _answers = new AnswerRepo(DbContext);94 }95 96 return _answers;97 }98 }99 100 72 public ApplicationDbContext DbContext { get; } 101 73
Note:
See TracChangeset
for help on using the changeset viewer.