Přidání vrstvy obchodní logiky do projektu, který používá vazbu modelu a webové formuláře
, autor: Tom FitzMacken
Tato série kurzů ukazuje základní aspekty použití vazby modelu s projektem ASP.NET Web Forms. Díky vazbě modelu je interakce dat jednodušší než práce s objekty zdroje dat (například ObjectDataSource nebo SqlDataSource). Tato série začíná úvodními materiály a v dalších kurzech se přesouvá k pokročilejším konceptům.
Tento kurz ukazuje, jak používat vazby modelu s vrstvou obchodní logiky. Nastavíte OnCallingDataMethods člen určit, že objekt jiný než aktuální stránka se používá k volání datových metod.
Tento kurz vychází z projektu vytvořeného v dřívějších částech série.
Celý projekt si můžete stáhnout v C# nebo VB. Kód ke stažení funguje se sadou Visual Studio 2012 nebo Visual Studio 2013. Používá šablonu sady Visual Studio 2012, která se mírně liší od šablony Visual Studio 2013 uvedené v tomto kurzu.
Co vytvoříte
Vazby modelu umožňují vložit kód interakce dat do souboru kódu na pozadí pro webovou stránku nebo do samostatné třídy obchodní logiky. Předchozí kurzy ukázaly, jak používat soubory kódu na pozadí pro kód interakce dat. Tento přístup funguje pro malé weby, ale může vést k opakování kódu a větší složitosti při údržbě velkých webů. Může být také velmi obtížné programově testovat kód, který se nachází v kódu za soubory, protože neexistuje žádná abstraktní vrstva.
Pokud chcete centralizovat kód interakce dat, můžete vytvořit vrstvu obchodní logiky, která obsahuje veškerou logiku pro interakci s daty. Potom zavoláte vrstvu obchodní logiky z webových stránek. V tomto kurzu se dozvíte, jak přesunout veškerý kód, který jste napsali v předchozích kurzech, do vrstvy obchodní logiky a pak tento kód použít ze stránek.
V tomto kurzu:
- Přesun kódu ze souborů kódu na pozadí do vrstvy obchodní logiky
- Změna ovládacích prvků vázaných na data tak, aby volaly metody ve vrstvě obchodní logiky
Vytvoření vrstvy obchodní logiky
Teď vytvoříte třídu, která je volána z webových stránek. Metody v této třídě vypadají podobně jako metody, které jste použili v předchozích kurzech, a zahrnují atributy zprostředkovatele hodnot.
Nejprve přidejte novou složku s názvem BLL.
Ve složce BLL vytvořte nový předmět s názvem SchoolBL.cs. Bude obsahovat všechny operace s daty, které se původně nacházely v souborech kódu na pozadí. Metody jsou téměř stejné jako metody v souboru kódu na pozadí, ale budou obsahovat určité změny.
Nejdůležitější změnou, kterou je třeba si uvědomit, je, že již neskončujete kód z instance třídy Page . Page Třída obsahuje TryUpdateModel metodu a ModelState vlastnost. Při přesunu tohoto kódu do vrstvy obchodní logiky již nemáte instanci třídy Page pro volání těchto členů. Chcete-li tento problém obejít, musíte přidat parametr ModelMethodContext do jakékoli metody, která přistupuje k TryUpdateModel nebo ModelState. Pomocí tohoto parametru ModelMethodContext můžete volat TryUpdateModel nebo načíst ModelState. Abyste mohli zohlednit tento nový parametr, nemusíte na webové stránce nic měnit.
Nahraďte kód v souboru SchoolBL.cs následujícím kódem.
using System;
using System.Linq;
using ContosoUniversityModelBinding.Models;
using System.Web.ModelBinding;
using System.Web.UI.WebControls;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
namespace ContosoUniversityModelBinding.BLL
{
public class SchoolBL : IDisposable
{
SchoolContext db = new SchoolContext();
public IQueryable<Student> GetStudents([Control] AcademicYear? displayYear)
{
var query = db.Students.Include(s => s.Enrollments.Select(e => e.Course));
if (displayYear != null)
{
query = query.Where(s => s.Year == displayYear);
}
return query;
}
public void InsertStudent(ModelMethodContext context)
{
var item = new Student();
context.TryUpdateModel(item);
if (context.ModelState.IsValid)
{
db.Students.Add(item);
db.SaveChanges();
}
}
public void DeleteStudent(int studentID, ModelMethodContext context)
{
var item = new Student { StudentID = studentID };
db.Entry(item).State = EntityState.Deleted;
try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
context.ModelState.AddModelError("",
String.Format("Item with id {0} no longer exists in the database.", studentID));
}
}
public void UpdateStudent(int studentID, ModelMethodContext context)
{
Student item = null;
item = db.Students.Find(studentID);
if (item == null)
{
context.ModelState.AddModelError("", String.Format("Item with id {0} was not found", studentID));
return;
}
context.TryUpdateModel(item);
if (context.ModelState.IsValid)
{
db.SaveChanges();
}
}
public IQueryable<Enrollment> GetCourses([QueryString] int? studentID)
{
var query = db.Enrollments.Include(e => e.Course)
.Where(e => e.StudentID == studentID);
return query;
}
private bool disposedValue = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposedValue)
{
if (disposing)
{
db.Dispose();
}
}
this.disposedValue = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
}
Revidovat existující stránky tak, aby načítaly data z vrstvy obchodní logiky
Nakonec převedete stránky Students.aspx, AddStudent.aspx a Courses.aspx z použití dotazů v souboru s kódem na pozadí na vrstvu obchodní logiky.
V souborech s kódem na pozadí pro Studenty, AddStudent a Courses odstraňte nebo zakomentujte následující metody dotazu:
- studentsGrid_GetData
- studentsGrid_UpdateItem
- studentsGrid_DeleteItem
- addStudentForm_InsertItem
- coursesGrid_GetData
Teď byste v souboru s kódem na pozadí neměli mít žádný kód, který se týká operací s daty.
OnCallingDataMethods obslužná rutina události umožňuje určit objekt, který se má použít pro datové metody. V souboru Students.aspx přidejte hodnotu obslužné rutiny události a změňte názvy datových metod na názvy metod ve třídě obchodní logiky.
<asp:GridView runat="server" ID="studentsGrid"
ItemType="ContosoUniversityModelBinding.Models.Student" DataKeyNames="StudentID"
SelectMethod="GetStudents"
UpdateMethod="UpdateStudent" DeleteMethod="DeleteStudent"
AllowSorting="true" AllowPaging="true" PageSize="4"
AutoGenerateEditButton="true" AutoGenerateDeleteButton="true"
AutoGenerateColumns="false"
OnCallingDataMethods="studentsGrid_CallingDataMethods">
V souboru s kódem na pozadí pro Students.aspx definujte obslužnou rutinu události CallingDataMethods události. V této obslužné rutině události zadáte třídu obchodní logiky pro operace s daty.
protected void studentsGrid_CallingDataMethods(object sender, CallingDataMethodsEventArgs e)
{
e.DataMethodsObject = new ContosoUniversityModelBinding.BLL.SchoolBL();
}
V addStudent.aspx proveďte podobné změny.
<asp:FormView runat="server" ID="addStudentForm"
ItemType="ContosoUniversityModelBinding.Models.Student"
InsertMethod="InsertStudent" DefaultMode="Insert"
OnCallingDataMethods="addStudentForm_CallingDataMethods"
RenderOuterTable="false" OnItemInserted="addStudentForm_ItemInserted">
protected void addStudentForm_CallingDataMethods(object sender, CallingDataMethodsEventArgs e)
{
e.DataMethodsObject = new ContosoUniversityModelBinding.BLL.SchoolBL();
}
V Courses.aspx proveďte podobné změny.
<asp:GridView runat="server" ID="coursesGrid"
ItemType="ContosoUniversityModelBinding.Models.Enrollment"
SelectMethod="GetCourses" AutoGenerateColumns="false"
OnCallingDataMethods="coursesGrid_CallingDataMethods">
protected void coursesGrid_CallingDataMethods(object sender, CallingDataMethodsEventArgs e)
{
e.DataMethodsObject = new ContosoUniversityModelBinding.BLL.SchoolBL();
}
Spusťte aplikaci a všimněte si, že všechny stránky fungují stejně jako dříve. Logika ověřování také funguje správně.
Závěr
V tomto kurzu přestrukturujete aplikaci tak, aby používala vrstvu přístupu k datům a vrstvu obchodní logiky. Určili jste, že ovládací prvky dat používají objekt, který není aktuální stránkou pro operace s daty.