Как управлять объектом контекста клиента в отдельной библиотеке классов? - PullRequest
0 голосов
/ 22 декабря 2018

Я пытаюсь создать библиотеку (библиотеку классов) для sharepoint, которая будет иметь все dll sharepoint для взаимодействия с сервером sharepoint для загрузки файлов, документов и создания библиотеки документов и набора документов .

Теперь эту библиотеку могут использовать клиенты, такие как веб-приложение (asp.net webform или mvc), консольное приложение, веб-сервисы api / wcf или окна, формирующие что угодно.

Так что здесь я немного запутался с созданием шаблонов репозитория и единицы рабочего уровня для управления объектом контекста клиента.

Я не уверен, разрешать ли создание контекста клиента для каждой операции или создаватьклиентский контекст один раз и повторное использование или необходимость создания клиентского контекста каждый раз.

У меня много поисков, но я не смог найти какую-либо ссылку или статью для создания слоя репозитория, как он создается в случае Entity framework DbContext.

Я использую Объектная модель на стороне клиента (библиотека CSOM) , и моя библиотека полностью посвящена система управления контентом для управления файлами и метаданными .

Буду признателен за любую помощь:)

Обновление: Пример кода для загрузки файла в домен sharepoint

ClientContext context = new ClientContext("http://SiteUrl"); // Starting with ClientContext, the constructor requires a URL to the server running SharePoint. 
context.Credentials = new SharePointOnlineCredentials(username, password);

// The SharePoint web at the URL.
Web myWeb = context.Web;

List myLibrary = myWeb.Lists.GetByTitle("MyProject"); //This is called document library so in sharepoint document Library is the root where we can create
                                                       //Document Set(Advance version of folder) or folder(Simple Folder) or upload files directly inside document library

FileCreationInformation info = new FileCreationInformation();
info.Url = "Sample.txt";
info.Overwrite = true;
info.Content = System.IO.File.ReadAllBytes("C://sample.txt"); //This will be user uploaded file that will be dynamic
myLibrary.RootFolder.Files.Add(info);
context.ExecuteQuery(); // Execute the query to the server.This is like EF SaveChanges method

Некоторые ссылки: https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ff649690(v=pandp.10)

https://docs.microsoft.com/en-us/sharepoint/dev/sp-add-ins/complete-basic-operations-using-sharepoint-client-library-code

https://docs.microsoft.com/en-us/previous-versions/office/developer/sharepoint-2010/ee538685%28v%3doffice.14%29

https://sharepoint.stackexchange.com/questions/96180/sharepoint-2013-csom-is-it-better-to-pass-a-context-object-around-or-a-url

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Относительно вашего первого вопроса:

Я не уверен, разрешить ли создание клиентского контекста для каждой операции или же создать клиентский контекст один раз и использовать повторно или каждый раз создавать 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.Я надеюсь, что это поможет вам.

0 голосов
/ 25 декабря 2018

Я думаю, что вам нужно создать службу аутентификации в службе WCF, как показано ниже, которая будет заботиться обо всех пользователях, которые вошли в систему. Когда вам поступает новый запрос, чтобы получить информацию об этом пользователе, если он является подлинным пользователем или нет, тогда выполнитесоответственно

    [ServiceContract]
    public interface IAuthenticationService
    {
       [OperationContract]
       ClientInfo ChangeSessionUser(User user);
       [OperationContract]
       ClientInfo GetSessionUserInfo();
       [FaultContract(typeof(ServiceFault))]
       [OperationContract]
       ClientInfo Login(LoginCredentials credentials);
       [OperationContract]
       void Logout(string id);
       [FaultContract(typeof(ServiceFault))]
       [OperationContract]
       void RemoveInvalidUserLogins();
       [OperationContract]
       void RemoveSesseionFromCache(string id);
       [FaultContract(typeof(ServiceFault))]
       [OperationContract]
       bool ValidateUser(LoginCredentials credentials);
    }
...