private void PreventMultipleBegin() { if (_isBeginCalledBefore) {AbpException(); } _isBeginCalledBefore = true; }
private void PreventMultipleComplete() { if (_isCompleteCalledBefore) {AbpException(); } _isCompleteCalledBefore = true; }
UnitOfWorkBaseµÄÆäËûʵÏÖÓëÉÏÃæµÄÀàËÆ£¨·ÇUnit of WorkÏà¹ØÄÚÈÝÂÔÈ¥£©£¬±ã²»È«Ìù³ö¡£µ«ÊÇÉÏÃæµÄ´úÂ룬´ó¼ÒÓз¢ÏÖÒ»¸öÎÊÌâÂ𣿠¾ÍÊÇÄÇЩPreventMultiple…·½·¨µÄʵÏÖ£¬ÓÃÀ´·ÀÖ¹¶à´ÎBegin¡¢CompleteµÈ¡£ÕâЩ·½·¨µÄʵÏÖ£¬ÔÚµ¥Ïß³ÌÏÂÊÇûÓÐÎÊÌâµÄ£¬µ«ÊÇÀïÃæ²¢Ã»ÓмÓËø£¬ËùÒÔ²»ÊÊÓÃÓÚ¶àÏ̡߳£ÕâÊÇ×÷ÕßµÄBUGÂ𣿠Ȼ¶ø£¬ÕâÈ´²¢²»ÊÇBUG£¬¶øÊÇÉè¼ÆÈç´Ë£¬ÎªºÎÄØ£¿ÒòΪÔÚÉè¼ÆÉÏ£¬Ò»¸öÏ̹߳²ÓÃÒ»¸ö¹¤×÷µ¥Ôª£¬Ò²¾Í²»´æÔÚ¶àÏß³ÌÁË¡£¹ØÓÚÕⲿ·ÖÄÚÈÝ£¬ºóÐø½«»á½éÉÜ¡£
IUnitOfWorkManagerÄ¿µÄÊÇÌṩһ¸ö¼ò½àµÄIUnitOfWork¹ÜÀí¶ÔÏ󣬶øIUnitOfWorkÔòÌṩÁËÕû¸ö¹¤×÷µ¥ÔªÐèÒªµÄËùÓпØÖÆ£¨Begin¡¢SaveChanges¡¢Complete¡¢Dispose£©¡£¶ø¾ßÌåÓ¦¸ÃÈçºÎ±£Ö¤Ò»¸öÏ̹߳²ÓÃÒ»¸ö¹¤×÷µ¥Ôª£¬ÈçºÎ»ñÈ¡µ±Ç°µÄ¹¤×÷µ¥Ôª£¬ÔòÓÉICurrentUnitOfWorkProvider½øÐйܿأ¬ÕýÈçÔÚ½âÎöUnitOfWorkManagerʱ£¬ËµÃ÷ÁËËüµÄCurrentʵ¼ÊÉϾÍÊǵ÷ÓÃICurrentUnitOfWorkProviderʵÏÖ¶ÔÏóµÄCurrentÊôÐÔ¡£
ICurrentUnitOfWorkProvider
public interface ICurrentUnitOfWorkProvider { IUnitOfWork Current { get; set; } }
ICurrentUnitOfWorkProvider½ö½öÖ»ÉùÃ÷ÁËÒ»¸öCurrentÊôÐÔ£¬ÄÇÃ´ÖØµãÈÃÎÒÃÇÀ´¿´¿´CurrentÔÚʵÏÖÀࣨCallContextCurrentUnitOfWorkProvider£©ÖÐÊÇÈçºÎдµÄ°É£º
[DoNotWire] public IUnitOfWork Current { get { return GetCurrentUow(Logger); } set { SetCurrentUow(value, Logger); } }
ÉÏÃæ±ê×¢µÄDoNotWireÊÇΪÁ˲»ÈÃIoC½øÐÐÊôÐÔ×¢È룬CurrentÄÚ²¿·Ö±ðµ÷ÓÃÁËGetCurrentUowºÍSetCurrentUow£¬ÒªÈ¡Öµ£¬ÏÈÒªÉèÖµ£¬ÈÃÎÒÀ´ÏÈ¿´¿´set°É£º
SetCurrentUow(IUnitOfWork value, ILogger logger) { if (value == null) {//Èç¹ûÔÚsetµÄʱºòÉèÖÃΪnull£¬±ã±íʾҪÍ˳öµ±Ç°¹¤×÷µ¥Ôª (logger); return; } unitOfWorkKey = CallContext.LogicalGetData(ContextKey) as string; if (unitOfWorkKey != null) { IUnitOfWork outer; if (UnitOfWorkDictionary.TryGetValue(unitOfWorkKey, out outer)) { if (outer == value) { logger.Warn(); return; } //µ½ÕâÀïÒ²¾Í±íʾµ±Ç°´æÔÚ¹¤×÷µ¥Ôª£¬ÄÇôÔÙ´ÎÉèÖù¤×÷µ¥Ôª£¬²»ÊÇÌæ»»µôµ±Ç°µÄ¹¤×÷µ¥Ôª¶øÊǽ«µ±Ç°¹¤×÷µ¥Ôª×÷Ϊ±¾´ÎÉèÖõŤ×÷µ¥ÔªµÄÍâ²ã¹¤×÷µ¥Ôª value.Outer = outer; } } unitOfWorkKey = value.Id; if (!UnitOfWorkDictionary.TryAdd(unitOfWorkKey, value)) {AbpException(); } //ÉèÖõ±Ç°Ï̵߳Ť×÷µ¥Ôªkey CallContext.LogicalSetData(ContextKey, unitOfWorkKey); }
ExitFromCurrentUowScope(ILogger logger) { //ContextKeyΪһ¸ö³£Á¿×Ö·û´® //CallContext¿ÉÒÔÀí½âΪÿ¸öÏ̵߳ĶÀÓÐkey,value¼¯ºÏÀ࣬ÿ¸öÏ̶߳¼»áÓÐ×Ô¼ºµÄ´æ´¢Çø£¬ // Ò²¾ÍÊÇÔÚÏß³ÌAÖÐÉèÖÃÒ»¸ökeyΪxxµÄvalue£¬ÔÚÏß³ÌBÖÐͨ¹ýxxÈ¡²»µ½£¬²¢¿ÉÒÔ´æÈëÏàͬ¼üµÄvalue£¬µ«ÊDz»»áÏ໥¸²¸Ç¡¢Ó°Ïì unitOfWorkKey = CallContext.LogicalGetData(ContextKey) as string; if (unitOfWorkKey == null) {//ûÓÐÈ¡µ½Öµ£¬±íʾµ±Ç°ÎÞ¹¤×÷µ¥Ôª logger.Warn(); return; } IUnitOfWork unitOfWork; (!UnitOfWorkDictionary.TryGetValue(unitOfWorkKey, out unitOfWork)) {//¸ù¾ÝkeyûÓÐÈ¡µ½value£¬´ÓÏ̼߳¯ºÏ£¨CallContext£©ÖÐÊͷŸÃkey CallContext.FreeNamedDataSlot(ContextKey); return; } //´Ó¹¤×÷µ¥Ôª¼¯ºÏÖÐÒÆ³ýµ±Ç°¹¤×÷µ¥Ôª UnitOfWorkDictionary.TryRemove(unitOfWorkKey, out unitOfWork); if (unitOfWork.Outer == null) {//Èç¹ûµ±Ç°¹¤×÷µ¥ÔªÃ»ÓÐÍâ²ã¹¤×÷µ¥Ôª£¬Ôò´ÓÏ̼߳¯ºÏ£¨CallContext£©ÖÐÊͷŸÃkey CallContext.FreeNamedDataSlot(ContextKey); return; } (!UnitOfWorkDictionary.TryGetValue(outerUnitOfWorkKey, out unitOfWork)) {//Èç¹ûµ±Ç°¹¤×÷µ¥ÔªÓÐÍâ²ã¹¤×÷µ¥Ôª£¬µ«ÊÇ´Ó¹¤×÷µ¥Ôª¼¯ºÏÖÐûÓÐÈ¡µ½ÁËÍâ²ã¹¤×÷µ¥Ôª£¬ÄÇôͬÑù´ÓÏ̼߳¯ºÏ£¨CallContext£©ÖÐÊͷŸÃkey CallContext.FreeNamedDataSlot(ContextKey); return; } //Äܵ½ÕâÀ¾Í±íʾµ±Ç°¹¤×÷µ¥ÔªÓÐÍâ²ã¹¤×÷µ¥Ôª£¬²¢ÇÒ´Ó¹¤×÷µ¥Ôª¼¯ºÏÖлñÈ¡µ½ÁËÍâ²ã¹¤×÷µ¥Ôª£¬ÄÇô¾ÍÉèÍâ²ã¹¤×÷µ¥ÔªÎªµ±Ç°¹¤×÷µ¥Ôª CallContext.LogicalSetData(ContextKey, outerUnitOfWorkKey); }
¿´Íêset£¬ÔÙÈÃÎÒÃÇÀ´¿´¿´get°É£º
¡¡