Управление состоянием DBContext за интерфейсом провайдера данных - PullRequest
1 голос
/ 24 декабря 2011

У меня есть интерфейс 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() { .. }
     // ...
}

Три реализации, конечно, будут вести себя очень по-разному в отношении состояний соединения и сущности. Так как интерфейс «правила» не применяет правила, какая реализация лучше? Или в случае, если мы должны обеспечить выполнение одного или другого, можно ли это сделать?

1 Ответ

0 голосов
/ 24 декабря 2011

Предполагая, что это на мобильном устройстве (что, я полагаю, имеет место из-за ссылок SqlCE), я думаю, что вы, возможно, делаете свою жизнь немного сложнее, чем нужно.

Нет причин, по которым вы не можете открыть соединение при запуске приложения и оставить его открытым в течение всего срока службы приложения, поскольку не должно быть никаких других приложений, использующих базу данных.

В течение многих лет у нас были производственные приложения WinCE, использующие этот подход, и у нас никогда не было с ним проблем.

...