Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework i工作单元如何使用-最佳实践_Entity Framework_Repository Pattern_Unit Of Work - Fatal编程技术网

Entity framework i工作单元如何使用-最佳实践

Entity framework i工作单元如何使用-最佳实践,entity-framework,repository-pattern,unit-of-work,Entity Framework,Repository Pattern,Unit Of Work,我正在.Net4.0web表单(不是MVC!)应用程序中使用EF4.3.1 我倾向于使用带有IUnitOfWork接口的存储库模式。但我想知道我是否遵循了最佳实践,尤其是因为我遵循的大多数示例都是基于MVC应用程序的 我会说这只是一个小的web应用程序,因此可能会影响解决方案的选择 该解决方案目前有3个项目:模型、逻辑和站点。模型包含codefirst实体和IUnitOfWork接口。逻辑包含存储库和服务层。网站显然包含网站、代码隐藏等 我不使用任何第三方注入实用程序(ninject等)。我用I

我正在.Net4.0web表单(不是MVC!)应用程序中使用EF4.3.1

我倾向于使用带有IUnitOfWork接口的存储库模式。但我想知道我是否遵循了最佳实践,尤其是因为我遵循的大多数示例都是基于MVC应用程序的

我会说这只是一个小的web应用程序,因此可能会影响解决方案的选择

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

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

公共预订存储库(IUnitOfWork unitOfWork)

我不太清楚如何处理服务层,IUnitOfWork应该也存在于站点项目中,还是只存在于逻辑层和模型层中

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

公共预订服务(IUnitOfWork、IBookingRepository、IAppSettings和appSettings)

但这意味着提交(保存到db)是在站点级别完成的,但我想知道是否应该在服务层完成。这还意味着,由于我的IUnitOfWork是在模型层中声明的,所以我还需要对我的站点中的模型的引用


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

这是一个很好的资源,可以帮助您开始了解如何将这些模式一起使用。它对MVC和web表单开发都有效


IUnitOfWork不应该传递到存储库中,而应该传递到服务中。参见这里的示例
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...
}