پیادهسازی الگوی Transaction Per Request در EF
نویسنده: سیروان عفیفی
تاریخ: ۱۳۹۴/۰۵/۲۰ ۱۷:۱۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
_categoryService.AddNewCategory(category);
_uow.SaveAllChanges();
throw new InvalidOperationException();
return RedirectToAction("Index"); public interface IRunAtInit
{
void Execute();
}
public interface IRunAfterEachRequest
{
void Execute();
}
public interface IRunAtStartUp
{
void Execute();
}
public interface IRunOnEachRequest
{
void Execute();
}
public interface IRunOnError
{
void Execute();
} public class TaskRegistry : StructureMap.Configuration.DSL.Registry
{
public TaskRegistry()
{
Scan(scan =>
{
scan.Assembliy("yourAssemblyName");
scan.AddAllTypesOf<IRunAtInit>();
scan.AddAllTypesOf<IRunAtStartUp>();
scan.AddAllTypesOf<IRunOnEachRequest>();
scan.AddAllTypesOf<IRunOnError>();
scan.AddAllTypesOf<IRunAfterEachRequest>();
});
}
} ioc.AddRegistry(new TaskRegistry());
protected void Application_Start()
{
// other code
foreach (var task in SmObjectFactory.Container.GetAllInstances<IRunAtInit>())
{
task.Execute();
}
}
protected void Application_BeginRequest()
{
foreach (var task in SmObjectFactory.Container.GetAllInstances<IRunOnEachRequest>())
{
task.Execute();
}
}
protected void Application_EndRequest(object sender, EventArgs e)
{
try
{
foreach (var task in SmObjectFactory.Container.GetAllInstances<IRunAfterEachRequest>())
{
task.Execute();
}
}
finally
{
HttpContextLifecycle.DisposeAndClearAll();
MiniProfiler.Stop();
}
}
protected void Application_Error()
{
foreach (var task in SmObjectFactory.Container.GetAllInstances<IRunOnError>())
{
task.Execute();
}
} public class TransactionPerRequest : IRunOnEachRequest, IRunOnError, IRunAfterEachRequest
{
private readonly IUnitOfWork _uow;
private readonly HttpContextBase _httpContext;
public TransactionPerRequest(IUnitOfWork uow, HttpContextBase httpContext)
{
_uow = uow;
_httpContext = httpContext;
}
void IRunOnEachRequest.Execute()
{
_httpContext.Items["_Transaction"] =
_uow.Database.BeginTransaction(System.Data.IsolationLevel.ReadCommitted);
}
void IRunOnError.Execute()
{
_httpContext.Items["_Error"] = true;
}
void IRunAfterEachRequest.Execute()
{
var transaction = (DbContextTransaction) _httpContext.Items["_Transaction"];
if (_httpContext.Items["_Error"] != null)
{
transaction.Rollback();
}
else
{
transaction.Commit();
}
}
} _categoryService.AddNewCategory(category);
_uow.SaveAllChanges();
throw new InvalidOperationException();
return RedirectToAction("Index");