WIP setting up new data project structure and event handlers

This commit is contained in:
2019-04-23 17:42:16 +00:00
parent 49f6ee5542
commit a437573af0
18 changed files with 196 additions and 85 deletions

View File

@@ -2,7 +2,6 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using BrightGlimmer.Data.Repositories; /* REMOVE LATER */
using MediatR;
using Microsoft.AspNetCore.Mvc;
@@ -12,18 +11,17 @@ namespace BrightGlimmer.Api.Controllers
[ApiController]
public class StudentController : ControllerBase
{
// private readonly IMediator mediator;
private readonly StudentRepository studentRepository;
private readonly IMediator mediator;
public StudentController(StudentRepository studentRepository)
public StudentController(IMediator mediator)
{
this.studentRepository = studentRepository;
this.mediator = mediator;
}
[HttpGet]
public IActionResult GetAll()
{
var customers = studentRepository.GetAll();
var customers = mediator.GetAll();
if (customers == null)
{
return NotFound();
@@ -32,28 +30,28 @@ namespace BrightGlimmer.Api.Controllers
return new ObjectResult(customers);
}
[HttpGet("createstudent")]
public IActionResult CreateStudent()
{
var created = studentRepository.Create(new Data.Domain.Student
{
Id = Guid.NewGuid(),
FirstName = "Giovani",
LastName = "Rodriguez",
Email = "giovaniluisrodriguez@gmail.com",
Phones = new List<Data.Domain.Phone>
{
new Data.Domain.Phone
{
Id = Guid.NewGuid(),
AreaCode = 305,
Number = 8888888,
Type = Data.Domain.PhoneType.HOMEPHONE
}
}
});
//[HttpGet("createstudent")]
//public IActionResult CreateStudent()
//{
// var created = studentRepository.Create(new Data.Domain.Student
// {
// Id = Guid.NewGuid(),
// FirstName = "Giovani",
// LastName = "Rodriguez",
// Email = "giovaniluisrodriguez@gmail.com",
// Phones = new List<Data.Domain.Phone>
// {
// new Data.Domain.Phone
// {
// Id = Guid.NewGuid(),
// AreaCode = 305,
// Number = 8888888,
// Type = Data.Domain.PhoneType.HOMEPHONE
// }
// }
// });
return new ObjectResult(created);
}
// return new ObjectResult(created);
//}
}
}

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using BrightGlimmer.Data;
using BrightGlimmer.Data.Interfaces;
using BrightGlimmer.Data.Repositories; /* REMOVE LATER */
using MediatR;
using Microsoft.AspNetCore.Builder;
@@ -31,10 +32,10 @@ namespace BrightGlimmer.Api
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddMediatR();
services.AddMediatR(typeof(Cqrs.Cqrs).Assembly); // Registers handlers in Cqrs project
services.AddScoped<StudentRepository, StudentRepository>(); /* REMOVE LATER */
services.AddDbContext<SqliteContext>(options => options.UseSqlite(Configuration.GetConnectionString("DefaultConnection")));
services.AddTransient<SqliteContext>();
services.AddMediatR(typeof(Cqrs.Cqrs).Assembly); // Registers handlers in services project
services.AddScoped(typeof(IRepository<>)); /* FIGURE OUT LATER */
services.AddDbContext<BgContext>(options => options.UseSqlite(Configuration.GetConnectionString("DefaultConnection")));
services.AddTransient<BgContext>();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
@@ -55,7 +56,7 @@ namespace BrightGlimmer.Api
// Makes sure that the database is in fact created
using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
{
var context = serviceScope.ServiceProvider.GetRequiredService<SqliteContext>();
var context = serviceScope.ServiceProvider.GetRequiredService<BgContext>();
context.Database.EnsureCreated();
}
}

View File

@@ -0,0 +1,29 @@
using BrightGlimmer.Data.Interfaces;
using BrightGlimmer.Domain;
using BrightGlimmer.Services.Queries;
using MediatR;
using Microsoft.EntityFrameworkCore; /* TODO */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace BrightGlimmer.Services.Handlers.QueryHandlers
{
public class GetAllStudentsQueryHandler : IRequestHandler<GetAllStudentsQuery, IEnumerable<Student>>
{
private readonly IRepository<Student> repository;
public GetAllStudentsQueryHandler(IRepository<Student> repository)
{
this.repository = repository;
}
public async Task<IEnumerable<Student>> Handle(GetAllStudentsQuery request, CancellationToken cancellationToken)
{
return await repository.Get().ToListAsync();
}
}
}

View File

@@ -0,0 +1,12 @@
using BrightGlimmer.Domain;
using MediatR;
using System;
using System.Collections.Generic;
using System.Text;
namespace BrightGlimmer.Services.Queries
{
public class GetAllStudentsQuery : IRequest<IEnumerable<Student>>
{
}
}

View File

@@ -1,4 +1,6 @@
using BrightGlimmer.Data.Domain;
using BrightGlimmer.Data.Interfaces;
using BrightGlimmer.Domain;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
@@ -6,9 +8,9 @@ using System.Text;
namespace BrightGlimmer.Data
{
public class SqliteContext : DbContext
public class BgContext : DbContext, IUnitOfWork
{
public SqliteContext(DbContextOptions<SqliteContext> options)
public BgContext(DbContextOptions<BgContext> options)
: base(options)
{
}

View File

@@ -11,7 +11,7 @@
</ItemGroup>
<ItemGroup>
<Folder Include="Interfaces\" />
<ProjectReference Include="..\BrightGlimmer.Domain\BrightGlimmer.Domain.csproj" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BrightGlimmer.Data.Interfaces
{
public interface IRepository<T>
{
IUnitOfWork UnitOfWork { get; }
T Create(T entity);
T Update(T entity);
void Remove(Guid id);
IQueryable<T> Get();
T Get(Guid id);
}
}

View File

@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace BrightGlimmer.Data.Interfaces
{
public interface IUnitOfWork
{
Task<int> SaveChangesAsync(CancellationToken cancellationToken = default);
}
}

View File

@@ -7,7 +7,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace BrightGlimmer.Data.Migrations
{
[DbContext(typeof(SqliteContext))]
[DbContext(typeof(BgContext))]
partial class SqliteDatabaseContextModelSnapshot : ModelSnapshot
{
protected override void BuildModel(ModelBuilder modelBuilder)

View File

@@ -0,0 +1,47 @@
using BrightGlimmer.Data.Interfaces;
using BrightGlimmer.Domain;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BrightGlimmer.Data.Repositories
{
public abstract class Repository<T> : IRepository<T> where T : Entity
{
public IUnitOfWork UnitOfWork => context;
protected BgContext context;
public Repository(BgContext context)
{
this.context = context;
}
public virtual T Create(T entity)
{
return context.Set<T>().Add(entity).Entity;
}
public virtual T Update(T entity)
{
return context.Set<T>().Update(entity).Entity;
}
public virtual void Remove(Guid id)
{
context.Set<T>().Remove(Get(id));
}
public virtual IQueryable<T> Get()
{
return context.Set<T>();
}
public virtual T Get(Guid id)
{
return context.Set<T>().Find(id);
}
}
}

View File

@@ -1,4 +1,5 @@
using BrightGlimmer.Data.Domain;
using BrightGlimmer.Data.Interfaces;
using BrightGlimmer.Domain;
using Microsoft.EntityFrameworkCore.ChangeTracking;
using System;
using System.Collections.Generic;
@@ -7,42 +8,8 @@ using System.Text;
namespace BrightGlimmer.Data.Repositories
{
public class StudentRepository
public class StudentRepository : Repository<Student>
{
private readonly SqliteContext context;
public StudentRepository(SqliteContext context)
{
this.context = context;
}
public Student Create(Student student)
{
EntityEntry<Student> entry = context.Students.Add(student);
context.SaveChanges();
return entry.Entity;
}
public void Update(Student student)
{
context.SaveChanges();
}
public void Remove(Guid id)
{
context.Students.Remove(GetById(id));
context.SaveChanges();
}
public IQueryable<Student> GetAll()
{
return context.Students;
}
public Student GetById(Guid id)
{
return context.Students.Find(id);
}
public StudentRepository(BgContext context) : base(context) { }
}
}

View File

@@ -0,0 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
</Project>

View File

@@ -2,14 +2,12 @@
using System.Collections.Generic;
using System.Text;
namespace BrightGlimmer.Data.Domain
namespace BrightGlimmer.Domain
{
public class Course
public class Course : Entity
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string Code { get; set; }
}
}

View File

@@ -0,0 +1,11 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace BrightGlimmer.Domain
{
public class Entity
{
public Guid Id { get; set; }
}
}

View File

@@ -2,11 +2,10 @@
using System.Collections.Generic;
using System.Text;
namespace BrightGlimmer.Data.Domain
namespace BrightGlimmer.Domain
{
public class Phone
public class Phone : Entity
{
public Guid Id { get; set; }
public PhoneType Type { get; set; }
public int AreaCode { get; set; }
public int Number { get; set; }

View File

@@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Text;
namespace BrightGlimmer.Data.Domain
namespace BrightGlimmer.Domain
{
public enum PhoneType
{

View File

@@ -2,11 +2,10 @@
using System.Collections.Generic;
using System.Text;
namespace BrightGlimmer.Data.Domain
namespace BrightGlimmer.Domain
{
public class Student
public class Student : Entity
{
public Guid Id { get; set; }
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }

View File

@@ -9,6 +9,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BrightGlimmer.Data", "Brigh
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BrightGlimmer.Services", "BrightGlimmer.CQRS\BrightGlimmer.Services.csproj", "{AA6A646D-C493-43DC-BBE4-FF253852D9BF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BrightGlimmer.Domain", "BrightGlimmer.Domain\BrightGlimmer.Domain.csproj", "{4E234F19-13EF-49A3-B8EB-FF7C9D2BF75F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -27,6 +29,10 @@ Global
{AA6A646D-C493-43DC-BBE4-FF253852D9BF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AA6A646D-C493-43DC-BBE4-FF253852D9BF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AA6A646D-C493-43DC-BBE4-FF253852D9BF}.Release|Any CPU.Build.0 = Release|Any CPU
{4E234F19-13EF-49A3-B8EB-FF7C9D2BF75F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4E234F19-13EF-49A3-B8EB-FF7C9D2BF75F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4E234F19-13EF-49A3-B8EB-FF7C9D2BF75F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4E234F19-13EF-49A3-B8EB-FF7C9D2BF75F}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE