zoukankan      html  css  js  c++  java
  • 关于工作单元模式——工作单元模式与EF结合的使用

      工作单元模式往往和仓储模式一起使用,本篇文章讲到的是工作单元模式和仓储模式一起用来在ef外面包一层,其实EF本身就是工作单元模式和仓储模式使用的经典例子,其中DbContext就是工作单元,而每个DbSet就是每个仓储,只有DbContext可以进行持久化操作。

    那么我们为什么还要在EF的外面再包一层对EF进行封装呢,有时候也是需要这样做的
    根据需要我们可以把EF框架和业务逻辑分开以达到解耦的目的。便于以后在需要的时候用其他ORM框架代替EF。
    另外,如果只使用仓储模式,那么我们就会在每个仓储中进行持久化操作。这样做往往是不合理的,
    持久化的操作应当交给工作单元。

     代码如下(代码是从网上找的例子)

    public class EventsController : Controller
    {
        private readonly ApplicationDbContext _context;
        private readonly UnitOfWork _unitOfWork;
    
        public EventsController()
        {
            _context = new ApplicationDbContext();    
            _unitOfWork = new UnitOfWork(_context);
        }
    
        public ActionResult Details(int id)
        {
            var event = _unitOfWork.Events.GetEvent(id);
            if (event == null)
                return HttpNotFound();
    
            var viewModel = new EventDetailsViewModel { Event = event };
    
            return View("Details", viewModel);
        }
    
        [Authorize]
        public ActionResult MyEvents()
        {
            var userId = User.Identity.GetUserId();
            var events = _unitOfWork.Events.GetUpcomingEventsByArtist(userId);
    
            return View(events);
        }
    
        [Authorize]
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(EventFormViewModel viewModel)
        {
            if (!ModelState.IsValid)
            {
                viewModel.Genres = _unitOfWork.Genres.GetGenres();
                return View("EventForm", viewModel);
            }
    
            var event = new Event
            {
                ArtistId = User.Identity.GetUserId(),
                DateTime = viewModel.GetDateTime(),
                GenreId = viewModel.Genre,
                Venue = viewModel.Venue
            };
    
            _unitOfWork.Events.Add(event);
            _unitOfWork.Complete();
    
            return RedirectToAction("MyEvents", "Events");
        }
    }
    public class UnitOfWork
    {
        private readonly ApplicationDbContext _context;
    
        public EventRepository Events { get; private set; }
        public GenreRepository Genres { get; private set; }
    
        public UnitOfWork(ApplicationDbContext context)
        {
            _context = context;
            Events = new EventRepository(context);
            Genres = new GenreRepository(context);
        }
    
        public void Complete()
        {
            _context.SaveChanges();
        }
    }
  • 相关阅读:
    SQL8-函数与触发器
    SQL7-约束与权限
    SQL6-连接与视图
    SQL5-数据类型
    SQL4-嵌套查询
    SQL3-基本运算
    SQL2-基本语法
    SQL1-结构概括
    SQL历史概论
    PHP Fatal error: Class 'mysqli' not found
  • 原文地址:https://www.cnblogs.com/dayang12525/p/10836697.html
Copyright © 2011-2022 走看看