IUnitOfWork如何使用 - 最佳实践

时间:2012-03-27 22:19:45

标签: entity-framework repository-pattern unit-of-work

我在.Net4.0网络表单(非MVC!)应用程序中使用EF4.3.1。

我倾向于将存储库模式与IUnitOfWork接口一起使用。但我想知道我是否遵循最佳实践,特别是因为我所遵循的大多数示例都基于MVC应用程序。

我会说它只是一个小型的网络应用程序,因此可能会影响解决方案的选择。

该解决方案目前有3个项目,模型,逻辑和站点。 Model包含codefirst实体和IUnitOfWork接口。逻辑包含存储库和服务层。网站显然包含网站,代码隐藏等。

我不使用任何第三方注入实用程序(ninject等)。我用IUnitOfWork手动注入存储库,即

public BookingRepository(IUnitOfWork unitOfWork)

如果IUnitOfWork也存在于Site项目中,或者仅存在于Logic和Model层中,我不太清楚如何处理服务层。

目前,我将一个存储库和一个工作单元注入服务,即

public BookingService(IUnitOfWork unitOfWork,IBookingRepository存储库,IAppSettings appSettings)

但这意味着提交(保存到数据库)是在站点级别完成的,但我想知道是否应该在服务层中完成。这也意味着,因为我的IUnitOfWork是在我的模型层中声明的,所以我也需要在我的网站中引用Model。

我能做得更好吗?我做对了吗?洛尔

1 个答案:

答案 0 :(得分:4)

德米特里是对的。以下是工作单元的示例实现。这样做的好处是,工作单元模式通过强制执行所有存储库共享的单个数据库上下文类来协调多个存储库的工作。

这是一个很好的资源,可以开始了解这些模式如何一起使用。它适用于MVC和Web窗体开发。 Implementing the Repository and Unit of Work Patterns in an ASP.NET MVC Application

public class UnitOfWork : IDisposable
{
    private DbContext _context;
    private PersonRepository _personRepository;
    private CompanyRepository _companyRepository;

    public UnitOfWork(DbContext context)
    {
        this._context = context;
    }

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

    // We lazy-load our repositories...
    public PersonRepository PersonRepository 
    {
        get
        {
            if (this._personRepository == null)
            {
                this._personRepository = new PersonRepository(context);
            }
            return _personRepository;
        }
    }

    public CompanyRepository 
    {
        get
        {
            if (this._companyRepository == null)
            {
                this._companyRepository = new CompanyRepository(context);
            }
            return _companyRepository;
        }
    }

    //IDisposable implementation removed for brevity...
}