[英]Creating a simple unit of work with Entity Framework and no repository
我一直在尝试实现.net MVC工作单元API(而不是创建单独的存储库),但是感觉不对。 我要用正确的方法吗?
BaseController
public class BaseController : ApiController
{
protected DBEntities _dbEntities;
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
_dbEntities = new DBEntities();
}
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
_dbEntities.SaveChanges();
}
}
我的控制器
public class MyController : BaseController
{
public HttpResponseMessage PutMyObject(int id, int id2)
{
if (id != 0)
{
var myObject = _dbEntities.MyObjects.Where(x => x.id == id);
if (myObject.Count() > 0)
{
MyObject temp = myObject.SingleOrDefault();
temp.Processed = true;
return Request.CreateResponse(HttpStatusCode.OK);
}
else
{
return Request.CreateErrorResponse(HttpStatusCode.NotFound);
}
}
else
{
/* do some other stuff */
}
}
}
我对此的想法是,控制器动作是单个工作单元。 控制器操作开始时将打开数据库连接,并在返回响应后调用SaveChanges。
我会以正确的方式处理吗? 在BaseController中调用savechanges之后,我需要处理_dbentities吗? (或者这是一个更好的代码审查交流问题)
我认为,对于OOP架构和灵活性而言,这将是一个糟糕的设计。 因为,您必须在主MVC项目中提供数据库操作,而不能在其他层中提供它们。 因此,您应该提供存储库模式,并且应该从MVC主项目和其他所需项目访问存储库。 因此,建议您在每个线程的单例类中处理_dbEntities
对象。
示例单例类将是这样;
public class UnitOfWorkSampleContextBase : IDisposable
{
[ThreadStatic]
private static UnitOfWorkSampleContextBase _instance;
public static UnitOfWorkSampleContextBase Instance
{
get
{
if (_instance == null)
{
_instance = new UnitOfWorkSampleContextBase();
}
return _instance;
}
}
public SampleDbContext Context { get; private set; }
private UnitOfWorkSampleContextBase()
{
}
public void Commit()
{
Context.SaveChanges();
}
public void ResolveContext()
{
Context = new SampleDbContext(ConfigurationManager.ConnectionStrings["MainDatabase"].ConnectionString);
}
public void Dispose()
{
Context.Dispose();
Context = null;
}
}
您可以像这样创建DbContext;
UnitOfWorkSampleContextBase.Instance.ResolveContext();
然后,您可以在这样的上下文中执行操作;
var context = UnitOfWorkSampleContextBase.Instance.Context;
var records = context.sampleEntities.ToList();
最后,您可以像这样提交和处理上下文。
UnitOfWorkSampleContextBase.Instance.Commit();
UnitOfWorkSampleContextBase.Instance.Dispose();
单例类应位于存储库或基础层中,以便可以访问所需的存储库类。
注意:如果使用CastleWindsor或类似的东西,则在拦截器中创建和提交上下文会更好。 同样,为每个线程初始化单例上下文类也很重要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.