2011-11-08 21 views
14

Tại sao một số ví dụ SharePoint sử dụngSPSite site = SPSite mới (SPContext.Current.Web.Url) vs SPContext.Current.Web.Site

using (SPSite site = new SPSite(SPContext.Current.Web.Url)) 
{ 
    ... 
} 

và không chỉ đơn giản?

SPSite site = SPContext.Current.Web.Site; 
... 

Cập nhật

Tôi nghĩ rằng tôi đã thu hẹp các câu hỏi xuống như sau:

Dường như tôi không nên sử dụng SPContent.Current trực tiếp, trừ khi tôi chắc chắn rằng mã của tôi chạy bên trong Điểm chia sẻ. Nhưng khi nào điều đó không đúng?

+1

Hãy nhìn vào một câu hỏi tương tự từ tôi: http://sharepoint.stackexchange.com/questions/20192/using-spcontext-current-or-using-static-url –

+0

Cảm ơn bạn đã liên kết. Tôi đã cập nhật câu hỏi của mình. –

+1

Trên các dự án lớn hơn, đôi khi bạn có các tiện ích bên ngoài không chạy trong SharePoint. Một ví dụ khác là các bài kiểm tra đơn vị cũng không chạy trong SharePoint. Nếu bạn chỉ đơn giản là phát triển webparts trực quan và không kiểm tra đơn vị - mã của bạn chạy trong SP. –

Trả lời

10

Hãy xem tài liệu thực hành tốt nhất trên disposing objects in SharePoint 2010 từ Microsoft, tuy nhiên có opposing views.

Có một vài takeaways chính cho các dự án SharePoint:

  • Luôn đoạt SPWeb/SPSite đối tượng của bạn -> bộ nhớ bị rò rỉ
  • Make sử dụng SPContext.Current ... khi bạn chắc chắn mã của bạn đang chạy trong một bối cảnh SharePoint
    • Unit Tests nghĩa là không có Sharepoint bối cảnh
    • tiện ích bên ngoài có nghĩa là không có bối cảnh Sharepoint
    • Powershell nghĩa là không có ngữ cảnh SharePoint (ví dụ: kích hoạt một tính năng với tính năng nhận có thể thất bại)
  • Đừng vứt bỏ SPContext.Current ... nhưng tạo đối tượng của riêng bạn (một lần nữa using)

Bạn có thể có problems with consistency với nhiều SP của bạn .. đối tượng .

Cuối cùng, SPSite site = SPContext.Current.Web.Site; là tốt trong một số trường hợp, nhưng bạn không có quyền kiểm soát đối tượng site này - đó có thể là vấn đề. Nếu bạn đi theo số new SPSite(...), bạn sẽ luôn có SPSite và không phải thứ gì đó mà SharePoint đã tạo và quản lý cho bạn.

Cá nhân tôi hầu như luôn đi theo cấu trúc using để tất cả các đối tượng được xử lý đúng cách sau đó. Hoặc tôi sử dụng SPContext.Current.Web mà không cần xử lý.

4

Tùy thuộc vào ngữ cảnh mà mã của bạn chạy. Ví dụ, bạn cần tạo một cá thể SPSite mới nếu bạn đang chạy trong khối RunWithElevatedPrivileges.

0

Dennis G là chính xác. Xử lý SPSite/SPWeb/etc là quan trọng nhưng hãy chắc chắn rằng bạn không vứt bỏ các đối tượng được API cung cấp trực tiếp cho bạn. Đó là tinh tế nhưng quan trọng nếu không phản ứng của bạn sẽ không bao giờ được tạo ra hoặc nguyên nhân thậm chí hủy bỏ thread. Theo kinh nghiệm của tôi, nếu tôi cần thông tin nhanh về thuộc tính SPSite hoặc SPWeb mà tôi chắc chắn có sẵn cho ngữ cảnh người dùng (hoặc người quản lý nội dung được người dùng ủy quyền hoặc ẩn danh), thì sử dụng đối tượng SPContext.Current. * Là tuyệt vời.Nếu không, sử dụng RunWithElevatedPriveleges phương pháp để quấn mã của bạn và bên lambda có mẫu sau:

SPSecurity.RunWithElevatedPrivileges(() => 
{ 
    using (SPSite site = new SPSite(SPContext.Current.Site.ID)) 
    { 
    using (SPWeb web = site.OpenWeb(SPContext.Current.Web.ID)) 
    { 
    // stuff goes here elevated 
    } 
    } 
}); 
Các vấn đề liên quan