?????????????1????????????????????????????????????????乹???????????? ASP.NET DI ??????????????????????????д??ó???????????贛??????乹???????????????????????????漰?????
??????????????????????????????????????????????????????滻?????????????????????????????????????????????????????????????????????????????????? GeekDinnerDbContext ?????????? DbContext ?????Щ???????????????????????????????????ó????????
????var optionsBuilder = new DbContextOptionsBuilder();
????optionsBuilder.UseSqlServer(Startup.ConnectionString);
????var dbContext = new GeekDinnerDbContext(optionsBuilder.Options);
????var controller = new DinnersController(dbContext);
????var result = (ViewResult) controller.Index();
???????? EF Core DbContext ???漰??????????? EF6 DbContext ??????Щ?????????????????????????????????? ASP.NET Core ?????EF Core ???????????黯?????????£????????????? DbContextOptionsBuilder??????????????????????? AddEntityFramework ?? AddSqlServer?????? EF ??????????????
???????????????в????
????????????????ó????????—??????????????ó?????????????????в?????????????????????ν??и??????????в???????????????????????????????ó?????????????????????е????????????????????????ASP.NET Core ?? EF Core ??????????в????
????????????????????????????????洢?? DbContext ???????????????д???????????????? DbContextOptions ?????????? GeekDinnerDbContext????????乹??????????????????????????????
var optionsBuilder = new DbContextOptionsBuilder<GeekDinnerDbContext>();
optionsBuilder.UseInMemoryDatabase();
_dbContext = new GeekDinnerDbContext(optionsBuilder.Options);
// Add sample data
_dbContext.Dinners.Add(new Dinner() { Title = "Title 1" });
_dbContext.Dinners.Add(new Dinner() { Title = "Title 2" });
_dbContext.Dinners.Add(new Dinner() { Title = "Title 3" });
_dbContext.SaveChanges();
???????????????н??????????ú??????????д?????????????????????????? ViewResult ??????У?
????[Fact]
????public void ReturnsDinnersInViewModel()
????{
????var controller = new OriginalDinnersController(_dbContext);
????var result = controller.Index();
????var viewResult = Assert.IsType<ViewResult>(result);
????var viewModel = Assert.IsType<IEnumerable<Dinner>>(
????viewResult.ViewData.Model).ToList();
????Assert.Equal(1?? viewModel.Count(d => d.Title == "Title 1"));
????Assert.Equal(3?? viewModel.Count);
????}
???????????????д?????????????????????????????????????????????????????粵???????м??????????????????????????????????????????в????????????????и??????????????????? EF Core ?????????????????????????????????????????????????е? EF????????????????????????????????? UI ????—????????Υ?????????????????????????
???????????????????????
???????????? (bit.ly/LS-Principle) ????????????????????????????????????? DI ???? DinnersController ??????????????????? DbContext????????y??????蹦?????????????????????????? EF ?С?
???????????????????????????????????? ??????????? DbContext?????????????????????????? Dinners ????????????????????????????? Dinner ???????????????? .NET ????? IEnumerable<Dinner>?????????????????????y??????? IEnumerable<Dinner>???????? Index ?????????????????
????public interface IDinnerRepository
????{
????IEnumerable<Dinner> List();
????}
?????????????洢???????????????? ???????????????????????????????????Щ?????????洢?????????????????????? IGetDinners ?? IDinnerService ?????κ???????????????????????????齫???? ICanHasDinner??????????????????????????????????????????á?
??????????????????????? DinnersController ?????? IDinnerRepository ????????????????????? GeekDinnerDbContext???????? List ????????????????
Dinners DbSet??
private readonly IDinnerRepository _dinnerRepository;
public DinnersController(IDinnerRepository dinnerRepository)
{
_dinnerRepository = dinnerRepository;
}
public IActionResult Index()
{
return View(_dinnerRepository.List());
}
?????????????????????????? Web ??ó?????????????? /Dinners ??????????? Invalid-OperationException?? ???????? GeekDinner.Controllers.DinnersController ??????????????“Geek-Dinner.Core.Interfaces.IdinnerRepository”?????
????????δ???????????????????????????????????? DI ???? IDinnerRepository ???????????????????????????
public class DinnerRepository : IDinnerRepository
{
private readonly GeekDinnerDbContext _dbContext;
public DinnerRepository(GeekDinnerDbContext dbContext)
{
_dbContext = dbContext;
}
public IEnumerable<Dinner> List()
{
return _dbContext.Dinners;
}
}
????????????????????????洢????????? EF?????????????? EF??????貼???????????????????????????ó???????????????????????ó???????????????????????????????
??????????????? IDinnerRepository ??? ASP.NET Core ?????????????????????????′???????????????? ConfigureServices ???????β??
????services.AddScoped<IDinnerRepository?? DinnerRepository>();
???????????? ASP.NET Core DI ???????????????????? IDinnerRepository ????????????? DinnerRepository ?????????????ζ?????????????? ASP.NET ???????? Web ?????????????????????????????????????????£?????????????????? DinnerRepository ????????????????????????? DbContext?????????????????????????
????????? ?????????????????????????á?
?????????? ?????????????? HTTP ?????н??е??????????????????????????? HTTP ???????????????к????????
????????? ????????????????Σ??????????????к?????????á?
?????????????????????????????????????????????????????????????????????????????????????????????????????????κ?????????????????? lambda ?????????????????????????????????????? ConfigureServices ?????????????????
?????????????????????????ó?????????????????С????????? 1 ?????????????????????3?????? IDinner-Repository ????????????????????в?????????????????????????????? EF??
????? 1 ??? Mock ??????? DinnersController
public class DinnersControllerIndex
{
private List<Dinner> GetTestDinnerCollection()
{
return new List<Dinner>()
{
new Dinner() {Title = "Test Dinner 1" }??
new Dinner() {Title = "Test Dinner 2" }??
};
}
[Fact]
public void ReturnsDinnersInViewModel()
{
var mockRepository = new Mock<IDinnerRepository>();
mockRepository.Setup(r =>
r.List()).Returns(GetTestDinnerCollection());
var controller = new DinnersController(mockRepository.Object?? null);
var result = controller.Index();
var viewResult = Assert.IsType<ViewResult>(result);
var viewModel = Assert.IsType<IEnumerable<Dinner>>(
viewResult.ViewData.Model).ToList();
Assert.Equal("Test Dinner 1"?? viewModel.First().Title);
Assert.Equal(2?? viewModel.Count);
}
}
???????? Dinner ??????б?????δ??????????????????С????????д????????????????????????Azure ??洢?? XML ???????????????????????????С?????????????У????????к??????????????????????…
????????????????????
?????????????????????????κ???????????—???????????????????????????????????????????????????????????????????????????????????????????????????????????Щ??????????? GeekDinner ??????????????? API???????κ?????? dinner ?? RSVP??
?????????dinner ????п??????????????? RSVP ?????????????????????????????? RSVP ?????????????????????С???dinner ?????????????儷?????????? RSVP ??????????????????????????? RSVP??
??????????????????????????????У????????????????????е?????????Σ??????? UI ????????? UI ?????????????????????????????????????????Ч????????????????????????????????????????????????????????????????????
?????????????????λ??λ????ó??????????У???????????????????????????????? UI????Dinner ??????????????????? RSVP ??????????????????? dinner ?洢????????????????????????? RSVP?????????????????????? RSVP ???????????????????????????????????????????
????????????? DateTime.Now???????????????????????????????????????????????????????? IDateTime ??????????? Dinner ??塣??????????????飬??? Dinner ????????????????????????????????????? EF ?? O/RM ???????Щ????????????????????????????????????????????y??????????EF ??????????????????????????????????????????
?????????????????????????? Dinner ???????????????????????????????????????????????? DinnerService ?? RsvpService???С?????????????????????? (bit.ly/anemic-model)?????????????????к???????????????????????????????????????£????????????—??????????????????????????????????????
????????????????? RSVP ?????????????????? 2?????ж???????????????????????У???Щ???????????????????????????