Aracılığıyla paylaş


Model bağlama ve web formları kullanan bir projeye iş mantığı katmanı ekleme

yazan: Tom FitzMacken

Bu öğretici serisi, bir ASP.NET Web Forms projesiyle model bağlama kullanmanın temel yönlerini gösterir. Model bağlama, veri etkileşiminin veri kaynağı nesneleriyle (ObjectDataSource veya SqlDataSource gibi) ilgilenmekten daha düz olmasını sağlar. Bu seri giriş niteliğindeki malzemelerle başlar ve sonraki öğreticilerde daha gelişmiş kavramlara taşınır.

Bu öğreticide, model bağlamanın bir iş mantığı katmanıyla nasıl kullanılacağı gösterilmektedir. Veri yöntemlerini çağırmak için geçerli sayfadan başka bir nesnenin kullanılacağını belirtmek için OnCallingDataMethods üyesini ayarlayacaksınız.

Bu öğretici, serinin önceki bölümlerinde oluşturulan projeyi oluşturur.

Projenin tamamını C# veya VB olarak indirebilirsiniz . İndirilebilir kod Visual Studio 2012 veya Visual Studio 2013 ile çalışır. Bu öğreticide gösterilen Visual Studio 2013 şablonundan biraz farklı olan Visual Studio 2012 şablonunu kullanır.

Oluşturacaklarınız

Model bağlama, veri etkileşim kodunuzu bir web sayfasının arka planındaki kod dosyasına veya ayrı bir iş mantığı sınıfına yerleştirmenizi sağlar. Önceki öğreticilerde, veri etkileşim kodu için arka planda kod dosyalarının nasıl kullanılacağı gösterilmiştir. Bu yaklaşım küçük sitelerde çalışır, ancak büyük bir siteyi korurken kod yinelemesine ve daha fazla zorluğa yol açabilir. Soyutlama katmanı olmadığından dosyaların arkasındaki kodda bulunan kodu program aracılığıyla test etmek de çok zor olabilir.

Veri etkileşim kodunu merkezileştirmek için, verilerle etkileşime geçmek için tüm mantığı içeren bir iş mantığı katmanı oluşturabilirsiniz. Ardından web sayfalarınızdan iş mantığı katmanını çağırırsınız. Bu öğreticide, önceki öğreticilerde yazdığınız tüm kodun bir iş mantığı katmanına nasıl taşınıp sayfalardan bu kodun nasıl kullanılacağı gösterilir.

Bu öğreticide şunları yapacaksınız:

  1. Kodu arka planda kod dosyalarından iş mantığı katmanına taşıma
  2. İş mantığı katmanındaki yöntemleri çağırmak için veri bağlı denetimlerinizi değiştirme

İş mantığı katmanı oluşturma

Şimdi, web sayfalarından çağrılan sınıfı oluşturacaksınız. Bu sınıftaki yöntemler, önceki öğreticilerde kullandığınız yöntemlere benzer ve değer sağlayıcısı özniteliklerini içerir.

İlk olarak , BLL adlı yeni bir klasör ekleyin.

klasör ekle

BLL klasöründe SchoolBL.cs adlı yeni bir sınıf oluşturun. Başlangıçta arka planda kod dosyalarında bulunan tüm veri işlemlerini içerir. Yöntemler, arka planda kod dosyasındaki yöntemlerle hemen hemen aynıdır, ancak bazı değişiklikler içerir.

Dikkat edilmesi gereken en önemli değişiklik, artık kodu Page sınıfının bir örneğinden yürütmediğinizdir. Page sınıfı TryUpdateModel yöntemini ve ModelState özelliğini içerir. Bu kod bir iş mantığı katmanına taşındığında, artık bu üyeleri çağırmak için Page sınıfının bir örneğine sahip olmazsınız. Bu sorunu çözmek için TryUpdateModel veya ModelState'e erişen herhangi bir yönteme ModelMethodContext parametresi eklemeniz gerekir. TryUpdateModel'i çağırmak veya ModelState'i almak için bu ModelMethodContext parametresini kullanırsınız. Bu yeni parametreyi hesaba eklemek için web sayfasındaki hiçbir şeyi değiştirmeniz gerekmez.

SchoolBL.cs dosyasındaki kodu aşağıdaki kodla değiştirin.

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);
        }
    }
}

İş mantığı katmanından veri almak için mevcut sayfaları gözden geçirme

Son olarak Students.aspx, AddStudent.aspx ve Courses.aspx sayfalarını arka planda kod dosyasındaki sorguları kullanmaktan iş mantığı katmanını kullanmaya dönüştürebilirsiniz.

Students, AddStudent ve Courses için arka planda kod dosyalarında aşağıdaki sorgu yöntemlerini silin veya açıklama satırı yapın:

  • studentsGrid_GetData
  • studentsGrid_UpdateItem
  • studentsGrid_DeleteItem
  • addStudentForm_InsertItem
  • coursesGrid_GetData

Artık arka planda kod dosyasında veri işlemleriyle ilgili kod bulunmamalıdır.

OnCallingDataMethods olay işleyicisi, veri yöntemleri için kullanılacak bir nesne belirtmenizi sağlar. Students.aspx dosyasında, bu olay işleyicisi için bir değer ekleyin ve veri yöntemlerinin adlarını iş mantığı sınıfındaki yöntemlerin adlarıyla değiştirin.

<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">

Students.aspx için arka planda kod dosyasında, CallingDataMethods olayının olay işleyicisini tanımlayın. Bu olay işleyicisinde, veri işlemleri için iş mantığı sınıfını belirtirsiniz.

protected void studentsGrid_CallingDataMethods(object sender, CallingDataMethodsEventArgs e)
{
    e.DataMethodsObject = new ContosoUniversityModelBinding.BLL.SchoolBL();
}

AddStudent.aspx'da benzer değişiklikler yapın.

<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();
}

Courses.aspx'de benzer değişiklikler yapın.

<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();
}

Uygulamayı çalıştırın ve tüm sayfaların daha önce olduğu gibi çalıştığına dikkat edin. Doğrulama mantığı da doğru şekilde çalışır.

Sonuç

Bu öğreticide, uygulamanızı bir veri erişim katmanı ve iş mantığı katmanı kullanacak şekilde yeniden yapılandıracaksınız. Veri denetimlerinin veri işlemleri için geçerli sayfa olmayan bir nesne kullandığını belirttiniz.