DbContext - 存储库和工作单元模式的组合?

时间:2013-04-04 12:04:18

标签: asp.net-mvc entity-framework

想知道我是否可以在这里获得一点指导。在DbContext的MSDN页面(http://msdn.microsoft.com/en-us/library/system.data.entity.dbcontext%28v=vs.103%29.aspx)上,它声明:“表示工作单元和存储库模式的组合,使您能够查询数据库并将更改组合在一起,然后将这些更改写回到存储中一个单位。“

我对存储库模式的理解是它提供了对数据持久层的抽象。如何将与EF相关的具体实现视为一种抽象?

另外,我如何利用它作为工作单元模式?目前,我的工作单元有一个ObjectContext属性,并且每个repos都有一个属性:

public class UnitOfWork : IUnitOfWork
{
    private TPSEntities _context = new TPSEntities();
    private ICustomerRepository _customerRepository;
    private IUsersRepository _UsersRepository;

    public ICustomerRepository CustomerRepository
    {
        get
        {
            if (_customerRepository == null)
            {
                _customerRepository = new CustomerRepository(_context);
            }
            return _customerRepository;
        }
    }

    public IUsersRepository UsersRepository
    {
        get
        {
            if (_UsersRepository == null)
            {
                _UsersRepository = new UsersRepository(_context);
            }
            return _UsersRepository;
        }
    }


    public void Save()
    {
        _context.SaveChanges();
    }

    public void Save(string storedProcedure)
    {
        _context.SaveChanges();
        //_context.ExecuteStoreCommand
    }

    private bool disposed = false;

    protected virtual void Dispose(bool disposing)
    {
        if (!this.disposed)
        {
            if (disposing)
            {
                _context.Dispose();
            }
        }
        this.disposed = true;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

然后我通过DI将我的工作单元对象注入我的控制器,然后离开。

使用DbContext有更好的方法吗?

谢谢,

克里斯

1 个答案:

答案 0 :(得分:1)

实际上,DbContext 对数据库的抽象 - 有几种来自Microsoft的SQL引擎,它们都可以与EF一起开箱即用,如果你在你的代码中使用EF,你必须改变以在引擎之间切换的唯一方法就是连接字符串。

也就是说,在你的情况下,想要另一个抽象,这次是通过ORM工具 - EF,这并不罕见。大多数指南,博客文章等我发现了演示存储库模式,通过抽象ORM工具来做到这一点。你也是这样,在你提供的代码中。

我想这可以归结为你对数据库层的定义"和"存储库" - 尽管我确信文献中有严格的定义,但这些定义在互联网上并不一致。 (惊讶?:P)