簡體   English   中英

如何在ASP MVC中實現工作單元,存儲庫和業務邏輯?

[英]How do implement Unit of Work, Repository and Business Logic in ASP MVC?

我目前被分配到使用實體框架的asp mvc項目。 這將是一個業務線應用程序。 我想使用存儲庫和工作單元模式開發此應用程序。 我是這個模式的新手(也是.net的新手),我在理解模式以及如何實現它時遇到了問題。

我已閱讀了大量文章,我認為這就是我的應用程序應該如何

實體框架 - >存儲庫 - >工作單元 - >客戶端(Asp MVC)

我附上了本文中的一些代碼http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in -an-ASP凈MVC應用程序

using System;
using ContosoUniversity.Models;

namespace ContosoUniversity.DAL
{
    public class UnitOfWork : IDisposable
    {
        private SchoolContext context = new SchoolContext();
        private GenericRepository<Department> departmentRepository;
        private GenericRepository<Course> courseRepository;

        public GenericRepository<Department> DepartmentRepository
        {
            get
            {

                if (this.departmentRepository == null)
                {
                    this.departmentRepository = new GenericRepository<Department>(context);
                }
                return departmentRepository;
            }
        }

        public GenericRepository<Course> CourseRepository
        {
            get
            {

                if (this.courseRepository == null)
                {
                    this.courseRepository = new GenericRepository<Course>(context);
                }
                return courseRepository;
            }
        }

        public void Save()
        {
            context.SaveChanges();
        }

        private bool disposed = false;

        protected virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    context.Dispose();
                }
            }
            this.disposed = true;
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
    }
}

工作單元將具有存儲庫,並將在創建時創建DBContext

因此,控制器將在創建時創建工作單元。 要顯示數據,我將使用此代碼

var department = UoW.departmentRepository.Find(1);
return View(department);

當客戶端單擊“保存”按鈕時,我將運行此代碼

UoW.departmentRepository.Update(department);
UoW.Save();

我的問題:

  1. 如果從數據檢索到客戶端單擊“保存”按鈕需要數小時,該怎么辦? 據我所知,我們必須盡量縮短背景。

  2. 我應該把業務邏輯放在哪里? 我把它放在存儲庫中嗎? 所以我會在保存之前調用UoW.departmentRepository.Validate(部門)。 但是,如果我需要驗證與其他實體相關的實體,該怎么辦? 我是否打電話給UoW.departmentRepository.Validate(課程,部門)?

是否有針對此類應用的完整示例項目?

編輯

正如Ant P所建議的那樣,我需要添加另一層來實現我的業務邏輯。

這就是我到目前為止所得到的

工作單位:

public class UnitOfWork : IDisposable
{
    private DBContext _context = new DBContext();

    public DBContext Context 
    {
      get 
      {
        return this._context;
      }
    }

    public void Save()
    {
        _context.SaveChanges();
    }

    private bool disposed = false;

    protected virtual void Dispose(bool disposing)
    {
        if (!this.disposed)
        {
            if (disposing)
            {
                context.Dispose();
            }
        }
        this.disposed = true;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
}

商業邏輯:

public class SalesBusinessLogic : IDisposable
{
    private ICustomerRepository _customerRepo;
    private ISalesRepository _salesRepo;
    private UnitOfWork _uow;

    public SalesBusinessLogic(UnitOfWork uow)
    {
      this._uow = uow;
    }

    public ICustomerRepository CustomerRepo
    {
        get
        {

            if (this._customerRepo == null)
            {
                this._customerRepo = new CustomerRepository(this._uow);
            }
            return this._customerRepo;
        }
    }

    public ISalesRepository SalesRepo
    {
        get
        {

            if (this._salesRepo == null)
            {
                this._salesRepo = new SalesRepository(this._uow);
            }
            return this._salesRepo;
        }
    }

    public bool Validate(Sales sales)
    {
      //this is where validation performed
      return true;
    }
}

控制器:

public SalesController : Controller
{
    private UnitOfWork _uow = new UnitOfWork();
    private SalesBusinessLogic _bl = new SalesBusinessLogic(this._uow);

    public ActionResult Index()
    {
        var sales = _bl.SalesRepo.Find(1);
        sales.CustomerID = 1;
        if _bl.Validate(sales)
        {
          _bl.SalesRepo.Update(sales);
          _uow.Save();
        }
        return View(sales);
    }    
}

這里UnitOfWork僅作為dbcontext的提供者,它將被業務邏輯和存儲庫使用。 存儲庫將在BusinessLogic類中。

服務器端驗證將由BusinessLogic處理,客戶端驗證將由Web Layer中的viewmodel處理。

我唯一擔心的是UnitofWork中的dbcontext是公共可訪問的。

我在正確的方向嗎?

如果從數據檢索到客戶端單擊“保存”按鈕需要數小時,該怎么辦? 據我所知,我們必須盡量縮短背景。

這不是問題 - 控制器是按請求實例化的。 用戶查看頁面時不會保留。 聽起來你誤解了控制器實例化的時間。 當您在控制器的構造函數中實例化UnitOfWork時,流程如下所示:

  • 用戶發出POST請求(通過單擊“保存”)。
  • 請求到達服務器並且實例化控制器(從而實例化工作單元)。
  • 調用action方法。
  • 工作單位處理完畢。

我應該把業務邏輯放在哪里? 我把它放在存儲庫中嗎? 所以我會在保存之前調用UoW.departmentRepository.Validate(部門)。 但是,如果我需要驗證與其他實體相關的實體,該怎么辦? 我是否打電話給UoW.departmentRepository.Validate(課程,部門)?

通常,您的業務邏輯將被抽象為位於Web應用程序和存儲庫之間的單獨層。 向您展示直接注入控制器的存儲庫的教程假設您具有“瘦”業務邏輯。

但是,驗證肯定不是存儲庫的工作。 您應該為每個視圖創建一個單獨的視圖模型,並驗證控制器中的視圖模型。 存儲庫應該僅用於CRUD操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM