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.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using BrightGlimmer.Data.Repositories; /* REMOVE LATER */
using MediatR; using MediatR;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
@@ -12,18 +11,17 @@ namespace BrightGlimmer.Api.Controllers
[ApiController] [ApiController]
public class StudentController : ControllerBase public class StudentController : ControllerBase
{ {
// private readonly IMediator mediator; private readonly IMediator mediator;
private readonly StudentRepository studentRepository;
public StudentController(StudentRepository studentRepository) public StudentController(IMediator mediator)
{ {
this.studentRepository = studentRepository; this.mediator = mediator;
} }
[HttpGet] [HttpGet]
public IActionResult GetAll() public IActionResult GetAll()
{ {
var customers = studentRepository.GetAll(); var customers = mediator.GetAll();
if (customers == null) if (customers == null)
{ {
return NotFound(); return NotFound();
@@ -32,28 +30,28 @@ namespace BrightGlimmer.Api.Controllers
return new ObjectResult(customers); return new ObjectResult(customers);
} }
[HttpGet("createstudent")] //[HttpGet("createstudent")]
public IActionResult CreateStudent() //public IActionResult CreateStudent()
{ //{
var created = studentRepository.Create(new Data.Domain.Student // var created = studentRepository.Create(new Data.Domain.Student
{ // {
Id = Guid.NewGuid(), // Id = Guid.NewGuid(),
FirstName = "Giovani", // FirstName = "Giovani",
LastName = "Rodriguez", // LastName = "Rodriguez",
Email = "giovaniluisrodriguez@gmail.com", // Email = "giovaniluisrodriguez@gmail.com",
Phones = new List<Data.Domain.Phone> // Phones = new List<Data.Domain.Phone>
{ // {
new Data.Domain.Phone // new Data.Domain.Phone
{ // {
Id = Guid.NewGuid(), // Id = Guid.NewGuid(),
AreaCode = 305, // AreaCode = 305,
Number = 8888888, // Number = 8888888,
Type = Data.Domain.PhoneType.HOMEPHONE // 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.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using BrightGlimmer.Data; using BrightGlimmer.Data;
using BrightGlimmer.Data.Interfaces;
using BrightGlimmer.Data.Repositories; /* REMOVE LATER */ using BrightGlimmer.Data.Repositories; /* REMOVE LATER */
using MediatR; using MediatR;
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder;
@@ -31,10 +32,10 @@ namespace BrightGlimmer.Api
{ {
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddMediatR(); services.AddMediatR();
services.AddMediatR(typeof(Cqrs.Cqrs).Assembly); // Registers handlers in Cqrs project services.AddMediatR(typeof(Cqrs.Cqrs).Assembly); // Registers handlers in services project
services.AddScoped<StudentRepository, StudentRepository>(); /* REMOVE LATER */ services.AddScoped(typeof(IRepository<>)); /* FIGURE OUT LATER */
services.AddDbContext<SqliteContext>(options => options.UseSqlite(Configuration.GetConnectionString("DefaultConnection"))); services.AddDbContext<BgContext>(options => options.UseSqlite(Configuration.GetConnectionString("DefaultConnection")));
services.AddTransient<SqliteContext>(); services.AddTransient<BgContext>();
} }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. // 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 // Makes sure that the database is in fact created
using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope()) using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
{ {
var context = serviceScope.ServiceProvider.GetRequiredService<SqliteContext>(); var context = serviceScope.ServiceProvider.GetRequiredService<BgContext>();
context.Database.EnsureCreated(); 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.Domain;
using BrightGlimmer.Data.Interfaces;
using BrightGlimmer.Domain;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@@ -6,9 +8,9 @@ using System.Text;
namespace BrightGlimmer.Data namespace BrightGlimmer.Data
{ {
public class SqliteContext : DbContext public class BgContext : DbContext, IUnitOfWork
{ {
public SqliteContext(DbContextOptions<SqliteContext> options) public BgContext(DbContextOptions<BgContext> options)
: base(options) : base(options)
{ {
} }

View File

@@ -11,7 +11,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Folder Include="Interfaces\" /> <ProjectReference Include="..\BrightGlimmer.Domain\BrightGlimmer.Domain.csproj" />
</ItemGroup> </ItemGroup>
</Project> </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 namespace BrightGlimmer.Data.Migrations
{ {
[DbContext(typeof(SqliteContext))] [DbContext(typeof(BgContext))]
partial class SqliteDatabaseContextModelSnapshot : ModelSnapshot partial class SqliteDatabaseContextModelSnapshot : ModelSnapshot
{ {
protected override void BuildModel(ModelBuilder modelBuilder) 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 Microsoft.EntityFrameworkCore.ChangeTracking;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@@ -7,42 +8,8 @@ using System.Text;
namespace BrightGlimmer.Data.Repositories namespace BrightGlimmer.Data.Repositories
{ {
public class StudentRepository public class StudentRepository : Repository<Student>
{ {
private readonly SqliteContext context; public StudentRepository(BgContext context) : base(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);
}
} }
} }

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.Collections.Generic;
using System.Text; 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 Name { get; set; }
public string Description { get; set; } public string Description { get; set; }
public string Code { 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.Collections.Generic;
using System.Text; 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 PhoneType Type { get; set; }
public int AreaCode { get; set; } public int AreaCode { get; set; }
public int Number { get; set; } public int Number { get; set; }

View File

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

View File

@@ -2,11 +2,10 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; 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 FirstName { get; set; }
public string MiddleName { get; set; } public string MiddleName { get; set; }
public string LastName { get; set; } public string LastName { get; set; }

View File

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