У меня есть интерфейс 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() { .. }
// ...
}
Три реализации, конечно, будут вести себя очень по-разному в отношении состояний соединения и сущности. Так как интерфейс «правила» не применяет правила, какая реализация лучше? Или в случае, если мы должны обеспечить выполнение одного или другого, можно ли это сделать?