HTML5¼¼Êõ

DDD ÁìÓòÇý¶¯Éè¼Æ£­Ì¸Ì¸Repository¡¢IUnitOfWorkºÍIDbContextµÄʵ¼ù£¨2£© - ÌïÔ°ÀïµÄó¬(2)

×ÖºÅ+ ×÷ÕߣºH5Ö®¼Ò À´Ô´£º²©¿ÍÔ° 2015-10-21 18:56 ÎÒÒªÆÀÂÛ( )

StudentService Æäʵ±ä»¯²»´ó£¬Ö»Êǽ«Ô­À´µÄ unitOfWork Ìí¼ÓÐ޸IJÙ×÷£¬¸Ä³ÉÁË studentRepository ºÍ _teacherRepository£¬Ö´ÐÐÏ StudentService.Add µÄµ¥Ôª²âÊÔ´úÂ룬·¢ÏÖÖ´Ðв»Í¨¹ý£¬ÎªÊ²Ã´ÄØ£¿ÒòΪ Repository

StudentService Æäʵ±ä»¯²»´ó£¬Ö»Êǽ«Ô­À´µÄ unitOfWork Ìí¼ÓÐ޸IJÙ×÷£¬¸Ä³ÉÁË studentRepository ºÍ _teacherRepository£¬Ö´ÐÐÏ StudentService.Add µÄµ¥Ôª²âÊÔ´úÂ룬·¢ÏÖÖ´Ðв»Í¨¹ý£¬ÎªÊ²Ã´ÄØ£¿ÒòΪ Repository ºÍ UnitOfWork µÄ IDbContext ²»ÊÇͬһ¸ö¶ÔÏó£¬Ìí¼ÓÐ޸ĶÔÏóͨ¹ý Repository ×¢²áµ½ IDbContext ÖУ¬×îºó UnitOfWork Ö´ÐÐ Commit È´ÊÇÁíÒ»¸ö IDbContext£¬ËùÒÔÎÒÃÇÐèҪȷ±£ Repository ºÍ UnitOfWork ¹²ÏíÒ»¸ö IDbContext ¶ÔÏó£¬ÔõôʵÏÖÄØ£¿

ÎÒÃǽøÐиÄÔìÏ£º

namespace DDD.Sample.Application { public class StudentService : IStudentService { private IDbContext _dbContext; private IUnitOfWork _unitOfWork; private IStudentRepository _studentRepository; private ITeacherRepository _teacherRepository; public StudentService(IDbContext dbContext) { _dbContext = dbContext; } public Student Get(int id) { _studentRepository = new StudentRepository(_dbContext); return _studentRepository.Get(id); } public bool Add(string name) { _unitOfWork = new UnitOfWork(_dbContext); _studentRepository = new StudentRepository(_dbContext); _teacherRepository = new TeacherRepository(_dbContext); var student = new Student { Name = name }; var teacher = _teacherRepository.Get(1); teacher.StudentCount++; _studentRepository.Add(student); _teacherRepository.Update(teacher); return _unitOfWork.Commit(); } } }

ÉÏÃæ¶ÔÓ¦µÄ²âÊÔ´úÂëÖ´ÐÐͨ¹ý£¬Æäʵ½â¾ö·½Ê½ºÜ¼òµ¥£¬¾ÍÊÇÊÖ¶¯¸ø UnitOfWork¡¢StudentRepository ºÍ TeacherRepository ×¢ÈëÏàͬµÄ IDbContext ¶ÔÏ󣬵±È»ÕâÊÇÒ»ÖÖ½â¾ö·½Ê½£¬»¹ÓÐÈËϲ»¶ÓÃÊôÐÔ×¢È룬Õâ¶¼ÊÇ¿ÉÒԵģ¬ÎÞ·Ç×îºó¾ÍÊÇÏëÈà Repository ºÍ UnitOfWork ¹²ÏíÒ»¸ö IDbContext ¶ÔÏó¡£

±¾ÆªµÄÏà¹Ø´úÂëÒÑÌá½»µ½ GitHub£¬´ó¼Ò¿ÉÒԲο¼Ï£ºhttps://github.com/yuezhongxin/DDD.Sample

3. ×ܽáÈýÖÖÉè¼Æ·½°¸

¹ØÓÚ Repository¡¢IUnitOfWork ºÍ IDbContext µÄÉè¼Æ£¬ÒÔ¼° Application Service µÄµ÷Óã¬ÎÒ×ܽáÁËÈýÖÖÉè¼Æ·½Ê½£¬ÎÒ¾õµÃÒ²ÊÇÎÒÃdz£Óõļ¸ÖÖ·½Ê½£¬ÏÂÃæÎÒ´óÖ·ֱð˵Ï¡£

1. IUnitOfWork -> EfUnitOfWork -> Repository -> Application Service

ÕâÖÖÉè¼ÆÓ¦¸ÃÎÒÃÇ×îÊìϤ£¬ÒòΪÎÒÃÇÒ»¿ªÊ¼¾ÍÊÇÕâÑùÉè¼ÆµÄ£¬µ«ÎÊÌâÒ²ÊÇ×î¶àµÄ£¬Òª²»È»ÎÒÒ²²»»áдÉÏһƪ²©ÎÄÁË£¬±ÈÈç´æÔÚµÄÎÊÌ⣺

ÉÏһƪ²©ÎÄ×îºó·ÖÎö³öÀ´ÊÇ IUnitOfWork µÄÉè¼ÆÎÊÌ⣬ÒòΪËü×öÁËÌ«¶àµÄÊ£¬²¢ÇÒ Repository ÒÀÀµÓÚ IUnitOfWork£¬ÒÔÖÁÓÚ×îºóÔÚ Application Service µÄµ÷ÓÃÖУ¬Repository ÏԵ÷dz£¶àÓ࣬ÕâÖÖÉè¼Æ×î´óµÄÎÊÌâ¾ÍÊÇÖ°Ôð²»Ã÷È·¡£

2. IDbContext -> IUnitOfWork/IRepository(only query) -> UnitOfWork/Repository -> Application Service

µÚ¶þÖÖÉè¼ÆÊÇÎұȽÏÇãÏòÓڵģ¬ÒòΪµÚÒ»ÖÖÉè¼Æ³öÏÖµÄÎÊÌ⣬ËùÒÔÎÒ¶Ô IUnitOfWork µÄÉè¼Æ·Ç³£¿´ÖØ£¬²¢ÇÒÎÒ¶ÁÁË¡¶ÆóÒµÓ¦Óüܹ¹Ä£Ê½¡·ÖйØÓÚ UnitOfWork µÄËùÓÐÄÚÈÝ£¬Æäʵ¾ÍÄÇô¼¸¸ö×Ö¿ÉÒÔ¸ÅÀ¨£ºÎ¬»¤¶ÔÏó״̬£¬Í³Ò»Ìá½»¸ü¸Ä¡£ÎÒ¸öÈ˾õµÃ¼Ü¹¹Éè¼Æ×îÖØÒªµÄµØ·½¾ÍÊǵײã½Ó¿ÚµÄÉè¼Æ£¬¾ÍÏñÎÒÃǸÇÒ»¶°Ä¦Ìì´óÂ¥£¬Èç¹ûµØ»ù´ò²»ÎÈ£¬×îºóµÄ½á¹û¿Ï¶¨ÊÇ¿åËú£¬ËùÒÔ£¬ÎұȽϼá³Ö IUnitOfWork ÕâÑùµÄÉè¼Æ£º

Ïà¶ÔÓÚµÚÒ»ÖÖÉè¼Æ£¬ÕâÖÖÉè¼Æ»¹ÓÐÒ»¸ö²»Í¬¾ÍÊÇ IUnitOfWork ºÍ IRepository Ϊƽ¼¶¹ØÏµ£¬ÎªÊ²Ã´ÕâÑùÉè¼Æ£¿ÒòΪÎÒÃDz»ÄÜͨ¹ý IUnitOfWork Ìṩ²éѯ²Ù×÷£¬²¢ÇÒ IUnitOfWork ºÍ ORM Ҳûʲô¹ØÏµ£¬ËùÒÔÎÒÃÇ×îºó³éÀë³öÀ´Ò»¸ö IDbContext£¬²¢ÇÒÓà EF ȥʵÏÖËü¡£

IRepository Ö»Óвéѯ£¬ÕâÊÇÎÒÃǵ͍Ò壬ÔÚ Application Service µÄµ÷ÓÃÖУ¬¶ÔÏóµÄÐÂÔöºÍÐ޸ͼÊÇͨ¹ý IUnitOfWork ½øÐÐʵÏֵģ¬ÒòΪ²éѯ²¢²»ÐèÒª¼Ç¼״̬£¬ËùÒÔÎÒÃDz¢²»ÐèÒª½« IDbContext ÔÚ IUnitOfWork ºÍ IRepository Ö®¼ä½øÐй²Ïí£¬ÓÐÈË»á˵£¬IRepository Ó¦¸ÃÌṩÁìÓò¶ÔÏóµÄÔöɾ¸Ä²Ù×÷°¡£¬ÎÒÃÇÔÙ¿´Ï Repository µÄ¶¨Ò壺Эµ÷ÁìÓòºÍÊý¾ÝÓ³Éä²ã£¬ÀûÓÃÀàËÆÓÚ¼¯ºÏµÄ½Ó¿ÚÀ´·ÃÎÊÁìÓò¶ÔÏó¡£

¼¯ºÏ·ÃÎÊÁìÓò¶ÔÏó£¬ÄÇ Repository Èç¹ûÕâÑùÉè¼ÆÄØ£º

public class StudentRepository : IStudentRepository { private IQueryable<Student> _students; public StudentRepository(IDbContext dbContext) { _students = dbContext.Set<Student>(); } public Student GetByName(string name) { return _students.Where(x => x.Name == name).FirstOrDefault(); } }

ÕâÖÖ Repository Éè¼ÆÊDZȽϷûºÏ¶¨ÒåµÄ£¬ÁíÍ⣬ÎÒÃÇÈç¹û¶Ô Domain ½øÐе¥Ôª²âÊÔ£¬¼¯ºÏÐÔÖʵÄÁìÓò¶ÔÏóÒ²ÊÇ¿ÉÒÔ½øÐÐά»¤µÄ£¬Ö»²»¹ýûÓг־û¯¶øÒÑ¡£

×ܵÄÀ´Ëµ£¬µÚ¶þÖÖÉè¼Æ×î´óµÄÓŵã¾ÍÊÇÖ°ÔðÃ÷È·£¬ÄãÏë¸É»µÊÂÒ²¸É²»ÁË£¨ÒòΪ½Ó¿ÚÒѾ­±»Ô¼Êø£©£¬Ä¿Ç°À´ËµÃ»·¢ÏÖʲôÎÊÌâ¡£

3. IDbContext -> IUnitOfWork(only commit)/IRepository -> UnitOfWork/Repository -> Application Service

µÚÈýÖÖÉè¼Æ¾ÍÊDZ¾Æª²©ÎĽ²ÊöµÄ£¬ËüÆäʵÊÇ´ÓµÚÒ»Öֺ͵ڶþÖÖÖ®¼äȡһ¸öÖмäÖµ£¬×öÁËһЩÍ×Э¹¤×÷£¬¾ßÌåµÄʵÏÖ£¬ÉÏÃæÒѾ­Ïêϸ˵Ã÷ÁË£¬ÎÒ×î½ÓÊܲ»Á˵ÄÊÇ¶Ô IUnitOfWork µÄ¸ü¸Ä£¬ËäÈ»±íÃæ¿´ÆðÀ´ÂùºÃµÄ£¬µ«ÎÒ×ܾõµÃÓÐЩ²»¶Ô¾¢µÄµØ·½£¬¾ÍÏñÎÒÃÇ¡°ÆÈÓÚÏÖʵ×öһЩΥ±³µÀµÂµÄÊ¡±£¬¿ÉÄÜÏÖÔÚ¾õ²ì²»µ½Ê²Ã´£¬µ«³öÀ´»ìµÄ×ÜÊÇÒª»¹µÄ¡£

¹ØÓÚ Repository¡¢IUnitOfWork ºÍ IDbContext µÄÉè¼Æ£¬ÒÔ¼° Application Service µÄµ÷Óã¬ÎÒ¾õµÃÓ¦¸ÃÊÇÎÒÃÇÔÚ DDD ¼Ü¹¹Éè¼Æ¹ý³ÌÖУ¬×îÆÕ±éÓöµ½µÄÒ»¸öÎÊÌ⣬µ«Ò²ÊÇ×îÀ§»óµÄÒ»¸öÎÊÌ⣬±ÈÈç×î½üÁ½¸öÔ°ÓÑдµÄ²©ÎÄ£º

  • ¹ØÓÚ Repository¡¢IUnitOfWork ÔÚÁìÓò²ãºÍÓ¦Ó÷þÎñ²ãÖ®¼äµÄ´úÂë·Ö²¼ÓëʵÏÖ
  • ¹ØÓÚ MVC EF ¼Ü¹¹¼° Repository ģʽµÄÒ»µãÐĵÃ
  • ¶ÔÓÚ±¾Æª²©ÎÄ£¬Èç¹ûÄãÓÐʲôÎÊÌâ»òÒÉÎÊ£¬»¶Ó­Ì½ÌÖѧϰ¡£:)

    posted @

    ¡¡

    1.±¾Õ¾×ñÑ­ÐÐÒµ¹æ·¶£¬ÈκÎ×ªÔØµÄ¸å¼þ¶¼»áÃ÷È·±ê×¢×÷ÕߺÍÀ´Ô´£»2.±¾Õ¾µÄÔ­´´ÎÄÕ£¬Çë×ªÔØÊ±Îñ±Ø×¢Ã÷ÎÄÕÂ×÷ÕߺÍÀ´Ô´£¬²»×ðÖØÔ­´´µÄÐÐΪÎÒÃǽ«×·¾¿ÔðÈΣ»3.×÷ÕßͶ¸å¿ÉÄܻᾭÎÒÃDZ༭Ð޸Ļò²¹³ä¡£

    Ïà¹ØÎÄÕÂ
    • Éè¼ÆÄ£Ê½£¨1£©µ¥Àýģʽ£¨Singleton£© - Fonour

      Éè¼ÆÄ£Ê½£¨1£©µ¥Àýģʽ£¨Singleton£© - Fonour

      2017-04-23 12:00

    • ¼Ü¹¹Éè¼ÆÊ¦ÄÜÁ¦Ä£ÐÍ - BloodyAngel

      ¼Ü¹¹Éè¼ÆÊ¦ÄÜÁ¦Ä£ÐÍ - BloodyAngel

      2017-03-28 11:00

    • Éè¼ÆÄ£Ê½£¨0£©¼òµ¥¹¤³§Ä£Ê½ - Fonour

      Éè¼ÆÄ£Ê½£¨0£©¼òµ¥¹¤³§Ä£Ê½ - Fonour

      2017-03-25 15:01

    • ûÓй¦ÄÜÐèÇóÉè¼ÆÎĵµ£¿¶Ô²»Æð£¬¾Ü¾ø¿ª·¢£¡ - CharlieChu

      ûÓй¦ÄÜÐèÇóÉè¼ÆÎĵµ£¿¶Ô²»Æð£¬¾Ü¾ø¿ª·¢£¡ - CharlieChu

      2017-03-16 13:04

    ÍøÓѵãÆÀ
    ¾