3

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

我对存储库模式的理解是它提供了对数据持久层的抽象。与 EF 耦合的东西的具体实现如何被视为抽象?

另外,我将如何利用它作为工作单元模式?目前,我的工作单元有一个 ObjectContext 属性,以及我的每个存储库的一个属性:

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 做到这一点?

谢谢,

克里斯

4

1 回答 1

1

实际上,DbContext 它是对数据库的抽象——Microsoft 提供了几种 SQL 引擎,它们都可以与 EF 一起使用,如果您在代码中使用 EF,那么您唯一需要更改的就是在它们之间切换引擎是连接字符串。

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

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

于 2013-04-04T12:11:19.283 回答