我有一个接口 IDataProvider 只公开(为了讨论)3个操作:
public interface IDataProvider
{
// get a list of projects (just metadata)
List<Project> ListProjects();
// load the Project by its GUID which we got from the metadata.
Project LoadProject(Guid id);
// save the project. underlying provider should determine to insert or update accordingly.
void SaveProject(Project data);
}
我使用 DBContext 访问 SQL CE 作为底层数据访问层数据提供者,我可以实现:
public DataProvider : SqlCeDbContext, IDataProvider { ... }
或者
public DataProvider : IDataProvider
{
List<Project> ListProjects()
{
using(var ctx = new SqlCeContext())
{
//... manage the life of the context for the API user.
}
}
// ...
}
或者
public DataProvider : IDataProvider
{
SqlCeContext _mSqlCeContext = new SqlCeContext();
List<Project> ListProjects() { .. }
// ...
}
这三种实现当然会在连接和实体状态方面表现得非常不同。既然接口“规则”没有对此强制执行规则,那么哪个实现更好?或者,如果我们应该执行其中一个或另一个,可以做到吗?