我有一个接口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() { .. }
// ...
}
对于连接和实体状态,这三种实现当然会表现得非常不同。由于接口“规则”没有对此强制执行规则,哪种实现更好?或者,如果我们应该强制执行其中一个,是否可以完成?
答案 0 :(得分:0)
假设这是在移动设备上(我认为是由于SqlCE引用的情况),我认为你的生活可能会比你需要的更复杂一些。
没有理由不能在应用程序启动时打开连接并在应用程序的整个生命周期中保持打开状态,因为不应该有任何其他应用程序使用该数据库。
我们已经生产了多年使用这种方法的WinCE应用程序并且从未遇到任何问题。