2009-06-23 5 views
2

SPSite, SPWeb, SPList 및 SPListItem과 같은 일부 SharePoint 개체를 하위 클래스로 만들려고합니다. 어떤 생각을하는 방법? 생성자를 사용하여 객체를 생성 할 수 없기 때문에 파생 클래스의 인스턴스를 만들 수 없습니다.SharePoint 개체 서브 클래 싱

나는 일반적으로 컨테이너 클래스를 사용하여 객체를 래핑했지만, 객체에 대한 좋은 의미 및 OOP 느낌을 제공하지 않기 때문에 좋은 해결책이라고 생각하지 않습니다. 어떤 도움이나 제안도 환영합니다.

감사합니다.

+0

하위 클래스에 추가 할 질문으로 질문을 업데이트 할 수 있습니까? Kusek의 답변에 대한 귀하의 의견에서 표준 SharePoint 개체와 하위 클래스 버전을 원하는 것처럼 보입니다. 왜 이걸하고 싶니? –

+0

안녕하세요, Alex입니다. 맞습니다. 표준 SharePoint 개체를 파생시키고 확장하여 내 메서드와 필드를 추가하려고합니다. 예를 들어 Order라는 사용자 지정 목록 정의가 있습니다. 같은 절차를 수행하는 대신 : SPListItem item = new SPListItem(); item [ "Title"] = "트랜스포머 DVD"; 상품 [ "가격"] = 30.5; 상품 [ "Qty"] = 2; item.Update(); OOP-way는 다음과 같이 수행되어야합니다. 주문 주문 = 새 주문 ("Transformers Movie", 30.5); order.SetQuantity (2); order.Save(); 그런 식으로. – denni

+0

죄송합니다. 서식이 잘못되었습니다. 새로운 답변 블록에서 평가 해 드리겠습니다. 확인해주십시오. – denni

답변

8

SharePoint 개체를 사용하지 않아도되므로 SharePoint 개체를 하위 클래스로 만들지 않는 것이 좋습니다. 몇 가지 메서드를 추가하거나 재정의하기 위해 SharePoint 개체를 하위 클래스로 만들려면 .NET의 확장 메서드 3.5. 그게 도움이 될거야.

+1

(+1) 전적으로 동의합니다. SP API 객체를 서브 클래 싱하거나, 확장 메소드를 생성하거나, 객체를 캡슐화하지 마십시오 (폐기해야 함을 잊지 마십시오!) – Colin

+0

Yepp, 정확하게 수행 한 작업 ... 구현에 매우 효과적입니다. 당신이 SPWeb에 갖고 싶었지만 그렇게하지 않기를 바란다. 어쩌면 SharePoint를위한 훌륭한 확장 방법 인 위키 포스트가 될 수 있을까요? –

+0

@Johan, http://spexlib.codeplex.com을 확인하십시오 –

0

이 올바른지, 나는 표준 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(); 

그런 식으로.

+0

다음 번에는 답변을 추가하는 대신이 정보로 질문을 편집하십시오. –

+0

그런데 상기시켜 줘서 고마워요, 당신은 어떤 대답이 있습니까? – denni

0

글쎄, 엔터티가 아닌 테이블의 행과 비슷한 SPListItem을 볼 수 있습니다. 데이터를 DB에 푸시하기 위해 우리는 모든 DB 관련 항목 및 데이터 전달을 처리하는 DB 레이어를 Entities를 통해 처리합니다. 위의 코드는 아래와 같이 다시 작성할 수 있습니다.

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

실제로 뭔가 잘못되었습니다.Order는 SPListItem 개체에서 파생되지 않으므로 예를 들어 order.ID, order.Title, order.Url과 같은 모든 속성을 다시 작성해야합니다. 상속을 통해 이러한 속성을 자동으로 가져옵니다. – denni

+0

오케이 그럼, SQL 테이블에 Order를 저장했다면 어떻게 처리하겠습니까? – Kusek

+0

관련성 높은 질문이 없습니다. SQL Table은 파생 된 객체를 제공하지 않습니다. 그러나 SharePoint는 않습니다. 귀하의 모든 반응에 감사 드리지만 주제에 대해 알려 주시기 바랍니다. 내 질문은 SharePoint 개체를 서브 클래 싱하는 방법입니다. 왜 안되는지 묻지 않을거야. 완전히 다른 토론이어야합니다. 감사합니다. – denni

0

SharePoint 개체 모델의 형식을 하위 클래스로 분류하는 다른 포스터의 의견에 동의하는 것은 좋지 않습니다. 그렇게에 대한 나의 가장 큰 이유는 다음과 같습니다. SharePoint에서 본질적으로 그들이에서 만든 상황에 기초하여 객체를 처분하는 것이

  • 방법
  • 당신은 아래 있지 아형에 따라 유형 계층 구조를 생성 할 것입니다 귀하의 제어.

처분 문제는 아마도 가장 큰 방해물 일 것입니다.

상속은 항상 OO 원칙을 고수하는 데있어서 최상의 솔루션은 아닙니다. 객체 계층 구조는 유지 보수 측면에서도 단점이 있습니다.

이미 완벽하게 유효한 OO 접근하고 (제 생각에) 상속을보다 선호 될 것이다 캡슐화 탐구 한 것 같은데 : 이러한 접근 방식 (상속 및 캡슐화)와

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와의 결합은 단일 저장소 유형으로 처리 할 수 ​​있으며, 다른 저장소 (향후 시나리오 또는 테스트 용)를 사용할 수 있도록 인터페이스를 둘 수 있습니다.

모두 유스 케이스와 코드 및 플랫폼이 향후 변경 될 수있는 정도에 따라 다릅니다.

멋지고 가벼운 접근 방식은 Chris O'Brien's blog (Simple data access pattern for SharePoint lists)입니다. 요구 사항이 그의 요구 사항과 일치하면 실용적인 방법입니다.

+0

안녕하세요, 답변 해 주셔서 감사합니다. 그러나 나는 당신의 의견에 동의해야만합니다. 첫째, SharePoint에 개체를 배치하는 방법은 이미 MS 모범 사례 문서에서 철저히 설명되어 있습니다. SharePoint 개발자로서 하위 클래스를 사용하는지 여부에 관계없이 처리 패턴에 대해 신중하게 알아야합니다. 둘째, SharePoint (또는 일반적으로 .NET Framework)에서는 일반적으로 파생하려는 유형을 제어하지 않습니다. 예를 들어 사용자 지정 웹 파트를 만들 때는 ASP.NET 또는 SharePoint에서 WebPart 클래스를 상속해야합니다.이 클래스는 우리가 제어 할 수있는 클래스가 아닙니다. – denni

+0

나는 크리스 오 브라이언 (Chris O'Brien)의 포스트를 만나기도 전에 어느 정도는 비슷한 방식으로 일을 해왔다. 앞서 언급했듯이 컨테이너, 저장소 패턴, 심지어는 확장 메서드도있었습니다. SharePoint 프로그래밍을 수행하는 방법에 대해 다른 접근 방식을 찾고 있습니다. SharePoint 개체를 상속하고 확장하는 것이 매우 흥미로울 것이라고 생각합니다. 어떤 종류의 접근 방식과 마찬가지로, 장단점이 있습니다. 나는 그것을하는 방법에 대한 구체적인 방법을 찾지 못했기 때문에 (그것에 대한 나의 답이 없음), 그것에 대한 토론은 너무 가설 적이기 때문에 피하려고한다. – denni

+0

안녕하세요. 기본 유형을 제어 할 수 없다는 요지가 유효합니다. 폐기 방법 : 클래스 사용자가 SharePoint 용으로 Dispose를 호출 할 때 동일한 규칙을 적용해야한다는 것을 알 수있는 방법은 무엇입니까? 발신자가 SPWeb을 하위 클래스로 분류하고 Dispose를 언제 호출해야 하는지를 알아야합니까? – dariom

관련 문제