Относительно вашего первого вопроса:
Я не уверен, разрешить ли создание клиентского контекста для каждой операции или же создать клиентский контекст один раз и использовать повторно или каждый раз создавать clientcontext.
Почему бы не позволить разработчикам, использующим вашу библиотеку, выбирать?т. е. вы предоставляете контекст, и они могут его инициализировать и сохранять в необходимом объеме.
Например, если ваша библиотека используется на веб-сайте, они могут захотеть инициализировать ее при каждом запросе, но если вашбиблиотека используется в настольном приложении, они могут захотеть инициализировать ее только один раз для каждого окна.
Относительно вашего второго вопроса:
У меня много поисков, но я не смог найти ни одногоссылка или статья для создания слоя репозитория в том виде, как он создается в случае Entity Framework DbContext.
Шаблоны репозитория и единицы работы - это просто уровни абстракции, которые можно применять к любому контексту.Хранилище будет реализовывать набор связанных операций для данного объекта или объекта, тогда как единица работы будет реализовывать набор связанных операций для одного или нескольких объектов в данном контексте (транзакция базы данных и т. Д.).
ИМХО хранилище не имеет особого смысла для того, что вы пытаетесь сделать, однако вы можете реализовать единицу работы, обертывающую экземпляр ClientContext
.
Сначала начните с интерфейса, определяя методычто вы выставите, например:
public interface IContentManagerUnitOfWork
{
IEnumerable<List> GetLists();
List CreateList(ListCreationInformation listCreationInformation);
List GetListByTitle(string title);
[...]
}
Затем вы реализуете это, вот идея:
public class ContentManagerUnitOfWork : IContentManagerUnitOfWork, IDisposable
{
private ClientContext clientContext;
private Web web;
public ContentManagerUnitOfWork(string url, username, password)
{
clientContext = new ClientContext(url);
clientContext .Credentials = new SharePointOnlineCredentials(username, password);
web = context.Web;
}
public IEnumerable<List> GetLists()
{
clientContext.Load(web.Lists);
clientContext.ExecuteQuery();
return web.Lists;
}
List CreateList(ListCreationInformation listCreationInformation)
{
List list = web.Lists.Add(listCreationInformation);
list.Update();
clientContext.ExecuteQuery();
return list;
}
List GetListByTitle(string title)
{
return web.Lists.GetByTitle("Announcements");
}
public void Dispose()
{
clientContext.Dispose();
}
}
Тогда любой разработчик, потребляющий вашу библиотеку, может просто использовать единицу работыс помощью методов, которые вы предоставляете:
using (var unitOfWork = new ContentManagerUnitOfWork("http://SiteUrl", username, password))
{
var lists = unitOfWork.GetLists();
}
Конечно, это всего лишь простой базовый пример, вы должны адаптировать его к вашим потребностям и убедиться, что это правильный способ взаимодействия с Sharepoint.Я надеюсь, что это поможет вам.