ÔÚ֮ǰµÄBeginʵÏÖÖУ¬ÎÒÃÇ¿´µ½£¬Æä·µ»ØÂ·ÏßÓÐÁ½¸ö£¬Ò»¸ö·µ»ØÁËInnerUnitOfWorkCompleteHandle¶ÔÏó£¬ÁíÒ»¸ö·µ»ØÁËIUnitOfWorkʵÏÖ¶ÔÏó¡£IUnitOfWorkÉÔºóÏêϸ½âÎö£¬ÈÃÎÒÃÇÏÈÀ´½âÎöInnerUnitOfWorkCompleteHandle £º
internal class InnerUnitOfWorkCompleteHandle : IUnitOfWorkCompleteHandle { DidNotCallCompleteMethodExceptionMessage = ; _isCompleteCalled; _isDisposed; public void Complete() { _isCompleteCalled = true; } public async Task CompleteAsync() { _isCompleteCalled = true; } public void Dispose() { if (_isDisposed) { return; } _isDisposed = true; if (!_isCompleteCalled) { if (HasException()) { return; } throw new AbpException(DidNotCallCompleteMethodExceptionMessage); } } HasException() { try { return Marshal.GetExceptionCode() != 0; } catch (Exception) { return false; } } }
ÎÒÃÇ¿ÉÒÔ¿´µ½£¬CompleteºÍCompleteAsyncÀïÃæ£¬¶¼Ö»ÊǼòµ¥µÄ½«_isCompleteCalledÉèÖÃΪtrue£¬ÔÚDispose·½·¨ÖУ¬Ò²½ö½öÖ»ÊÇÅжÏÊÇ·ñÒѾdispose¹ý¡¢ÊÇ·ñÍê³É¡¢ÊÇ·ñÓÐÒì³££¬Ã»Óиü¶àµÄ¶¯×÷¡£ÕâÑù´ó¼Ò»á²»»áÓÐÒ»¸öÒÉÎÊ“Õâ¸ö¹¤×÷µ¥ÔªµÄÍê³ÉºÍÊͷʤ×÷ÀïûÓоßÌåµÄÍê³É²Ù×÷£¬Ôõô¾ÍËãÍê³É¹¤×÷µ¥ÔªÁË£¿”£¬Õâʱ£¬ÈÃÎÒÃǽáºÏʹÓõ½InnerUnitOfWorkCompleteHandleµÄµØ·½À´¿´£º
if (options.Scope == TransactionScopeOption.Required && _currentUnitOfWorkProvider.Current != null) { return new InnerUnitOfWorkCompleteHandle(); }
Õâ¸öÅжϣ¬´ú±íÁ˵±Ç°ÒѾ´æÔÚ¹¤×÷µ¥Ôª£¬ËùÒÔÕâ¸ö¾ÍÊÇÓÃÓÚ¹¤×÷µ¥ÔªÇ¶Ìס£ÄÚ²¿µÄ¹¤×÷µ¥ÔªÔÚÌá½»ºÍÊÍ·Åʱ£¬²»ÐèÒª×öʵ¼ÊµÄÌá½»ºÍÊÍ·Å£¬Ö»ÐèÒª±£Ö¤Ã»ÓÐÒì³£Å׳ö£¬È»ºó×îÍâ²ã¹¤×÷µ¥ÔªÔÙ½øÐÐʵ¼ÊµÄÌá½»ºÍÊÍ·Å¡£ÕâÒ²¾Í˵Ã÷£¬ÔÚBegin·½·¨ÖеÄÁíÒ»Ìõ·Ïߣ¬·µ»ØIUnitOfWorkʵÏÖ¶ÔÏó²ÅÊÇ×îÍâ²ãµÄÊÂÎñ¶ÔÏó¡£
IUnitOfWork
public interface IUnitOfWork : IActiveUnitOfWork, IUnitOfWorkCompleteHandle { Id { get; } //Íâ²ã¹¤×÷µ¥Ôª IUnitOfWork Outer { get; set; } Begin(UnitOfWorkOptions options); }
IUnitOfWork³ýÁ˼̳ÐÁËIUnitOfWorkCompleteHandle½Ó¿Ú£¬ÓµÓÐÁËComplete·½·¨Í⣬»¹¼Ì³ÐÁËIActiveUnitOfWork½Ó¿Ú£º
public interface IActiveUnitOfWork { EventHandler Completed; event EventHandler<UnitOfWorkFailedEventArgs> Failed; event EventHandler Disposed; //¹¤×÷µ¥ÔªÉèÖà UnitOfWorkOptions Options { get; } //Êý¾Ý¹ýÂËÅäÖà IReadOnlyList<DataFilterConfiguration> Filters { get; } bool IsDisposed { get; } void SaveChanges(); Task SaveChangesAsync(); IDisposable DisableFilter(params string[] filterNames); IDisposable EnableFilter(params string[] filterNames); bool IsFilterEnabled(string filterName); IDisposable SetFilterParameter(string filterName, string parameterName, object value); }
Õâ¸ö½Ó¿ÚÖаüº¬Á˺ܶàFilterÏà¹ØµÄÊôÐÔÓë·½·¨£¬¶¼ÊÇЩÊý¾Ý¹ýÂËÏà¹ØµÄ£¬ÕâÀï²»¶ÔÆä½øÐнéÉÜ£¬ËùÒÔÕâ¸ö½Ó¿ÚÀÖ÷Òª°üº¬ÁËÈý¸öʼþ£¨Completed¡¢Failed¡¢Disposed£©£¬¹¤×÷µ¥ÔªÉèÖã¨Options£©£¬IsDisposedÒÔ¼°Í¬²½Òì²½µÄSaveChanges¡£
³ýÁËIUnitOfWork½Ó¿Ú£¬ABP»¹ÌṩÁËÒ»¸öʵÏÖIUnitOfWork½Ó¿ÚµÄ³éÏó»ùÀàUnitOfWorkBase£¬UnitOfWorkBaseµÄÖ÷ҪĿµÄ£¬ÊÇΪ¿ª·¢ÈËÔ±´¦ÀíһЩǰÖᢺóÖù¤×÷ºÍÒì³£´¦Àí£¬ËùÒÔUnitOfWorkBaseʵÏÖÁ˲¿·Ö·½·¨£¬²¢ÌṩÁËһЩ³éÏó·½·¨£¬ÔÚʵÏֵIJ¿·ÖÖÐ×öºÃǰºóÖù¤×÷£¬È»ºóµ÷ÓóéÏó·½·¨£¬½«Ö÷ҪʵÏÖ½»¸ø×ÓÀ࣬²¢¶ÔÆä½øÐÐÒì³£´¦Àí£¬ÏÂÃæÒÔBeginʵÏÖÓëCompleteʵÏÖΪÀý£º
public void Begin(UnitOfWorkOptions options) { if (options == null) { ); } //·ÀÖ¹Begin±»¶à´Îµ÷Óà (); Options = options; //¹ýÂËÅäÖà SetFilters(options.FilterOverrides); //³éÏó·½·¨£¬×ÓÀàʵÏÖ BeginUow(); } public void Complete() { //·ÀÖ¹Complete±»¶à´Îµ÷Óà (); try { //³éÏó·½·¨£¬×ÓÀàʵÏÖ CompleteUow(); _succeed = true; OnCompleted(); } catch (Exception ex) { _exception = ex; throw; } }
¡¡