繁体   English   中英

使用Entity Framework创建简单的工作单元,无需存储库

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM