Создание подклассов объектов SharePoint - PullRequest
2 голосов
/ 23 июня 2009

Я хочу создать подкласс некоторых объектов SharePoint, таких как SPSite, SPWeb, SPList и SPListItem. Есть идеи как это сделать? Я не могу создать экземпляр моего производного класса, поскольку не могу создать объекты с помощью конструктора.

Я обычно использовал контейнерный класс, чтобы обернуть упомянутые объекты, но я не думаю, что это хорошее решение, поскольку оно не обеспечивает хорошую семантику и ощущение ООП для объектов. Любая помощь или предложение приветствуются.

Спасибо.

Ответы [ 4 ]

8 голосов
/ 23 июня 2009

Я рекомендую не создавать подклассы объектов SharePoint, так как я не вижу в этом никакого смысла. Если вы собираетесь создавать подклассы объектов SharePoint просто для добавления или переопределения нескольких методов, попробуйте использовать методы расширения .NET 3.5 , Это должно помочь вам.

0 голосов
/ 26 июня 2009

Я согласен с мнением других авторов, что подклассификация типов в объектной модели SharePoint - плохая идея. Мои главные причины для этого:

  • способ, которым SharePoint по сути располагает объекты в зависимости от контекста, в котором они были созданы.
  • вы бы создавали иерархию типов на основе подтипов, которые не находятся под вашим контролем.

Проблема утилизации, вероятно, является самым большим сдерживающим фактором.

Наследование не всегда является лучшим решением для соблюдения принципов ОО. У иерархии объектов есть и свои недостатки, когда дело доходит до обслуживания.

Похоже, вы уже исследовали инкапсуляцию, которая является совершенно допустимым ОО-подходом и предпочтительнее наследования (на мой взгляд):

public class Order {
    private SPListItem listItem;
    ...
    public Order(SPListItem listItem) {
        this.listItem = listItem;
    }

    ...

    public int ItemName {
        get { return listItem["Title"] as string }
        set { listItem["Title"] = value; }
    }
    ...
}

Одна из проблем этих подходов (наследование и инкапсуляция) заключается в том, что они связывают ваши объекты с базовым хранилищем данных (в данном случае SharePoint). Это может или не может быть плохой вещью, в зависимости от того, что вы пытаетесь создать.

Альтернативный подход заключается в отделении вашего кода от основного хранилища и использовании хранилища для обработки получения и обновления объектов в хранилище. По крайней мере любое соединение с SharePoint может быть обработано одним типом репозитория, и вы можете установить интерфейс вокруг него, чтобы позволить вам использовать другие репозитории (для будущих сценариев или для тестирования).

Все зависит от вашего варианта использования и того, насколько ваш код и платформа могут измениться в будущем.

Один хороший и легкий подход - в блоге Криса О'Брайена (Простой шаблон доступа к данным для списков SharePoint) . Если ваши потребности совпадают с его, это практический путь.

0 голосов
/ 24 июня 2009

Ну, я бы посмотрел SPListItem, похожий на строку в таблице, чем на сущность. Для передачи данных в БД у нас будет слой БД, который обрабатывает все связанные с БД вещи, и передача данных происходит через сущности. Выше код может быть переписан, как показано ниже.

class Order{ 
    public int Price {get;set;};
    public int Qty {get;set;}; 
    public String ItemName {get;set;};}
class OrderHandler{
     Order m_Order=null;
    public OrderHandler(Order oEntity)
    {
          m_Order=oEntity;
    }

    public void Insert(){
       SPListItem item = new SPListItem();
       item["Title"] = m_Order.ItemName;
       item["Price"] = m_Order.Price.ToString();
       item["Qty"] = m_Order.Qty.ToString();
       item.Update();
    }
}

Я совершенно уверен, что в этом нет ничего плохого.

0 голосов
/ 24 июня 2009

это правильно, я хочу извлечь стандартные объекты SharePoint и расширить его, добавив свои собственные методы и поля. Например, у меня есть собственное определение списка под названием Order. Вместо того, чтобы делать процедурные, как:

SPListItem item = new SPListItem();
item["Title"] = "Transformers DVD";
item["Price"] = 30.5;
item["Qty"] = 2;
item.Update();

The OOP-way should be done like this:
Order order = new Order("Transformers Movie", 30.5);
order.SetQuantity(2);
order.Save();

Нечто подобное.

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