哪个是将存储库模式用于数据库上下文的最佳代码?

Which is the best code using repository pattern for database context?

我正在实施存储库模式,我怀疑哪种代码在标准和良好实践方面更好。

这是我正在启动的 MVC 5 项目,考虑了存储库模式。

这是第一种方法: 我正在使用 connstructor 来设置 de db 上下文并在我使用的每个方法中使用

public class EmployeeRepository : IEmployeeRepository
{
    private DBModel contextBD;

    public EmployeeRepository(DBModel contextBD)
    {
        this.contextBD = contextBD;
    }

    public async Task<bool> Add(Employee employee)
    {
        using (contextBD)
        {
            contextBD.Employee_Table.Add(new Employee_Table()
            {
                LLP_Id = employee.id,
                Name = employee.name,
            });
            await contextBD.SaveChangesAsync();
        }
        return true;
    }
}

第二种方法是这样的: 我不使用构造函数,并在 using 块中设置上下文

public class EmployeeRepository : IEmployeeRepository
{
    public async Task<bool> Add(Employee employee)
    {
        using (DBModel contextBD = new DBModel())
        {
            contextBD.Employee_Table.Add(new Employee_Table()
            {
                LLP_Id = employee.id,
                Name = employee.name,
            });
            await contextBD.SaveChangesAsync();
        }
        return true;
    }
}

哪个效果更好,哪个是最佳实践,为什么,unis 的好处是什么。

在第一个示例中,由于您是 IoC 注入它,因此您不应将其包装在 using 语句中,因为此实例将被此调用的所有方法使用。 (假设注入了 IoC。)

虽然第二个选项可行,但您无法进行任何单元测试,因为它现在是 hard-coded。

我会推荐第三种选择。我会注入一个 ContextFactory。它看起来像这样:

public class EmployeeRepository : IEmployeeRepository
{
    private IDBModelFactory factory;

    public EmployeeRepository(IDBModelFactory factory)
    {
        this.factory = factory
    }

    public async Task<bool> Add(Employee employee)
    {
        using (var contextBD = factory.Create())
        {
            contextBD.Employee_Table.Add(new Employee_Table()
            {
                LLP_Id = employee.id,
                Name = employee.name,
            });
            await contextBD.SaveChangesAsync();
        }
        return true;
    }
}

在这种情况下,Create() 方法实现只是 return new DBModel(),现在您可以开始了!