The DataContext or ObjectContext is the Unit of Work.
So, your DAL will save, delete and retrieve objects and your DataContext/ObjectContext will keep track of your objects, manage transactions and apply changes.
This is an example just to illustrate the idea of the solution.
using(var context = new ObjectContext()) { // Unit of Work
var repo = new ProductRepository(context);
var product = repo.GetXXXXXXX(...);
...
// Do whatever tracking you want to do with the object context. For instance:
// if( error == false) {
// context.DetectChanges();
// context.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
// }
}
And your repository will look like:
public abstract class Repository?{
public Respository(ObjectContext context){
CurrentContext = context;
}
protected ObjectContext CurrentContext { get; private set; }
}
public class ProductRespository : Repository {
public ProductRespository(ObjectContext context) : base(context){
}
public Product GetXXXXXX(...){
return CurrentContext... ; //Do something with the context
}
}
Another way is to put the unit of work (Object context) globally:
You need to define what will be your unit of work scope. For this example, it will be a web request. In a real world implementation, I'd use dependency injection for that.
public static class ContextProvider {
public static ObjectContext CurrentContext?{
get {?return HttpContext.Items["CurrentObjectContext"];
}
public static void OpenNew(){
var context = new ObjectContext();
HttpContext.Items["CurrentObjectContext"] = context;
}
public static void CloseCurrent(){
var context = CurrentContext;
HttpContext.Items["CurrentObjectContext"] = null;
// Do whatever tracking you want to do with the object context. For instance:
// if( error == false) {
// context.DetectChanges();
// context.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
// }
context.Dispose();
}
}
In this example, ObjectContext is the unit of work and it will live in the current request. In your global asax you could add:
protected void Application_BeginRequest(object sender, EventArgs e){
ContextProvider.OpenNew();
}
protected void Application_EndRequest(object sender, EventArgs e){
ContextProvider.CloseCurrent();
}
In your Repositories, you just call ContextProvider.CurrentContext
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…