2010-11-12 3 views
0

У меня есть класс, в котором некоторые свойства возвращаются к базе данных, ТОЛЬКО, когда они вызываются. Итак, рассмотрим следующий пример:C# Lazy loading & Ajax

class User 
{ 
    public int UserID { get; internal set; } 
    public string UserName { get; set; } 
    public Role[] Roles 
    { 
     get 
     { 
     if (this.UserID > 0) 
      return RoleRepository.GetByUserID(this.UserID).ToEntityArray(); 
     else 
      return RoleRepository.GetByUserName(this.UserName).ToEntityArray(); 
     } 
    } 
} 

Существует также класс ролей, но это, вероятно, не имеет значения. Свойство «Роли» в классе «Пользователь» похоже на ленивую загрузку. Он извлекает информацию только тогда, когда это свойство доступно. Вопрос в том, как я могу использовать JQuery для обеспечения того, чтобы ленивая загрузка происходила или это возможно? Любые статьи по этой концепции также будут полезны.

Благодаря

+0

Какая технология вы используете для взаимодействия с вашим C# из jQuery? –

+0

Вы имеете в виду, как окна или ASP.NET? Или вы имеете в виду back-end? Для front-end, его ASP.net mvc и backend его sql-сервер '05. – Skadoosh

ответ

2

Я не вижу, что JQuery должен сделать с этим на всех.

Прикосновение к этой собственности вызовет ленивую нагрузку.

Если вы используете JQuery вызвать некоторые HttpHandler/WebMethod/ActionMethod/и т.д., как только вы пытаетесь перебирать или доступа, собственности он будет загружать эти данные

Кроме того, вместо того, что Биз логика в вашем объекте домена вы можете попробовать делегат подход, чтобы сохранить «как» данные связаны с этим имуществом в надлежащем месте

class User 
{ 
    public int UserID { get; internal set; } 
    public string UserName { get; set; } 

    public delegate Role[] GetRolesDelegate(int userId, string username); 

    public GetRolesDelegate GetRoles { get; set; } 

    Role[] _roles; 
    public Role[] Roles 
    { 
     get 
     { 
      if (_roles == null) 
      { 
       _roles = GetRoles == null 
        ? new Role { } 
        : GetRoles(UserID, UserName).ToEntityArray(); 
      } 
      return _roles; 
     } 
    } 
} 

Тогда вы могли бы связать, что как так:

User user = new User(); 

user.GetRoles = RoleRepository.GetRoles; 
+0

Хм ... Я думаю, это имеет смысл. – Skadoosh

0

Как охотник Я не уверен, что это с jQuery. Чтобы сделать свойство Roles lazy load, добавьте свойство private backing, которое сохраняет значение при первом доступе из репозитория. Затем для последующих обращений вы можете просто вернуть эту закрытую переменную, а не проходить через RoleRepository. Что-то вроде:

class User 
{ 
    public int UserID { get; internal set; } 
    public string UserName { get; set; } 
    private Role[] _roles; 

    public Role[] Roles 
    { 
     get 
     { 
     if (_roles == null) 
     {  
      if (this.UserID > 0) 
       _roles = RoleRepository.GetByUserID(this.UserID).ToEntityArray(); 
      else 
       _roles = RoleRepository.GetByUserName(this.UserName).ToEntityArray(); 
     } 

     return _roles; 
     } 
    } 
} 
+2

Вы имеете в виду if (_roles == null)? Если нет, это не lazy-loading, это никогда не загружается :) –

+0

typo 'if (_roles == null)' – hunter

+0

мог бы назвать эту простую загрузку ;-) –