哪个是将存储库模式用于数据库上下文的最佳代码?
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()
,现在您可以开始了!
我正在实施存储库模式,我怀疑哪种代码在标准和良好实践方面更好。
这是我正在启动的 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()
,现在您可以开始了!