Who is Ali Özgür?

RecentComments

Comment RSS
aliozgur posted on January 31, 2007 14:26
using System;
using System.Collections.Generic;
using System.Query;
using System.Text;
using Bilgi.Common.Utils;
using Bilgi.Org.Core.DataInterfaces;
using Bilgi.Org.Core.Domain;
using Bilgi.Org.Data;
using Bilgi.Calendar.Core.Accessibility.DataInterfaces;
using Bilgi.Calendar.Core.Accessibility.Domain;
using Bilgi.Calendar.Core.Space.DataInterfaces;
using Bilgi.Calendar.Core.Space.Domain;
namespace Bilgi.Calendar.Core
{
  public sealed class UserSessionDataProvider
  {
    private DaoFactoryExposer _daoFactoryExposer = new DaoFactoryExposer();
    private IList<SpaceAccessibility> _spaceAccessibilities = null;
    private IList<OrgUnit> _inUnits = null;
    private IList<BaseSpace> _ownedSpaces = null;
    private IList<UnitSpace> _unitSpaces = null;
    private IOrgUserDao _userDao = new OrgUserDao();
    public IOrgUserDao UserDao
    {
      // Some code     
    }
    private IOrgUserUnitRoleDao _userUnitRoleDao = new OrgUserUnitRoleDao();
    public IOrgUserUnitRoleDao UserUnitRoleDao
    {
      // Some code   
    }
    private ISpaceAccessibilityDao _spaceAccessDao = null;
    public ISpaceAccessibilityDao SpaceAccessDao
    {
      // Some code      
    }
    private ISpaceDao _spaceDao = null;
    public ISpaceDao SpaceDao
    {
     // Some code  
    }
    private int _userID = -1;
    public int UserID
    {
      // Some code      
    }
   
    public OrgUser User
    {
     // Some code  
    }
    private void CheckValidUser( )
    {
     // Some code  
    }
    public void LogOnSecure( string username, string hashedPwd, Hash.ServiceProviderEnum hashServiceProvider )
    {
     // Some code     
    }
    public void LogOn( string username, string clearTextPwd )
    {
     // Some code      
    }
    /// <summary>
    /// LogOn olmuş kullanıcının session'da taşınacak ve bir anlamda cachelenecek olan
    /// tüm bilgilerini yüklemek için kullanılır.
    /// Bu aşamada alınan tüm bilgiler sorgulamalarda kullanılmaktadır.
    /// </summary>
    public void LoadUserSessionData()
    {
      // Some code     
    }
    /// <summary>
    /// LogOn olmuş kullanıcı için tanımlı tüm alan erişim bilgilerini yükler.
    /// Alan erişimi ile ilgili sorgular bu bilgi üzerinden yapılır.
    /// </summary>
    private void LoadUserSpaceAccessibilities()
    {
      // Some code
    }
    /// <summary>
    /// LogOn olmuş kullanıcının MEMBER rolünde bulunduğu birimleri yüklemek için kullanılır
    /// </summary>
    private void LoadUserUnits()
    {
      // Some code
    }
    /// <summary>
    /// LogOn olmuş olan kullanıcının sahibi olduğu veya MEMBER rolünde
    /// olduğu için dolaylı olarak erişebileceği alanları yüklemek için kullanılır
    /// </summary>
    private void LoadPersonalAndUnitSpaces()
    {
     // Some code  
    }
    public UserAccessibilityData GetUserSpaceAccess(BaseSpace space)
    {
      /*
       * 1- Alanın kullanıcıya ait bir alan olup olmadığını kontrol ediyoruz.
       * Eğer alan kullanıcıya aitse kullanıcının full erişime sahip olduğunu
       * varsayarak ilgili bilgiyi döndürüyoruz.
       */
      var s = from os in _ownedSpaces
                    where os.ID == space.ID
                    select os;
     
      if( s != null )
      {
        UserAccessibilityData data = new UserAccessibilityData();
        data.ApplyFullAccess();
        data.IsOwned = true;
        return data;
      }
      /*
       * 2- Kullanıcı için tanımlanmış bir erişim bilgisi var mı kontrol ediyoruz.
       * Eğer erişim tanımı varsa bu tanımın kullanılacağını varsayıp bilgiyi döndürüyoruz.
       */
     
      var spaceAcces = from sa in _spaceAccessibilities
                       where sa.SpaceID == space.ID && sa.UserID == _userID
                       select sa;
     
      if( spaceAcces.Count<SpaceAccessibility>() > 0 )
      {
        UserAccessibilityData data = new UserAccessibilityData();
        data.InheritedFromUnit = false;
        data.IsOwned = false;
        SpaceAccessibility sa = spaceAcces.ElementAt<SpaceAccessibility>(0);
        data.CopyFrom(sa);       
        return data;
      }
       /*
        * 3- Kullanıcının MEMBER rolünde olduğu birimler için yapılmış
        * erişim tanımı var mı kontrol ediyoruz.
        * Kullanıcının içinde olduğu birimlerden hangisinin erişim yetkisi
        * daha büyükse o erişim yetkisi ile ilgili bilgiler döndürülür.
       */
      var inUnits = from u in _inUnits
                    select u.ID;
       
      var unitAccess = from sa in _spaceAccessibilities
                       where sa.SpaceID == space.ID &&  inUnits.Contains<int>(sa.UnitID ?? -1)
                       select sa;
     
      if( unitAccess.Count<SpaceAccessibility>() > 0 )
      {
        UserAccessibilityData data = new UserAccessibilityData();
        data.InheritedFromUnit = true;
        foreach(SpaceAccessibility sa in unitAccess )
        {
          data.Or(sa);
        }
        return data;
      }
      return null;
    }
  }
}

Posted in: .NET Development  Tags:
aliozgur posted on January 23, 2007 14:17
1. Bilgi.Utils
Bilgi.Utils projesi altında temel olarak aşağıdaki kategorilerde gruplandırılabilecek class’lar yer almaktadır:
  • Hibernate
  • NUnit
  • Genel
1.1.   Bilgi.Utils.Hibernate
 Bu projenin içinde NHibernate’in projelerimizde kullanımını kolaylaştırmak için tasarlanmış bazı classlarla, tasarımlarımızı benzer tutmak için geliştirilmiş interfaceler yer almaktadır.
 NHSessionManager
 Bu class singleton bir class’tır. Doğrudan NHibernate session objesine ulaşmamıza gerek kalmadan hibernate session yönetimi ile ilgili temel işlevleri sunmaktadır. İki modda çalıştırılabilir
  • Web: NHibernate session’u  ve transactionlar request bazında bilgi taşımak için kullanılan HttpContext.Current.Items koleksiyonunda taşınır. Bu koleksiyonda taşınan bilginın scope’u requestin başlangıcı ve bitişi arasındaki zamandır.
  • WinForm: NHibernate session’u  ve transactionlar private bir hashtable üzerinde taşınır. Scope progamcı tarafından belirlenir. Duruma göre session kapatılıp açılarak scope dolaylı olarak belirlenmiş olunur.
 Session yönetimi Web (http request bazında session) ve WinForm uygulamalarında (her form için ayrı session) tercihe göre farklılık gösterebilir. Ancak temel fikir singleton NHSessionManager class’ının kendisini kullanan data access objelerine her zaman hazır bir session instance’ı vermesidir. NHSessionManager class’ının data access objelerine sunacağı session objesinin ne olacağına Web modunda çalıştırılırken doğrudan programcı tarafından karar verilemez, NHSessionManager bir hibernate session  objesi hazırlayarak kullanıma sunacaktır. Ancak WinForm modunda çalıştırıldığında CreateSession() ve SetCurrentSession() prosedürleri ile, örneğin her formun kendi session’unu kendi içinde taşıması ve form aktif hale geldikçe NHSessionManager.SetCurrentSession() çağırısı ile data access objelerine sunulacak session objesinin dışarıdan belirlenmesi sağlanabilir.
Bu iki farklı session yönetimi yaklaşımının kullanılmasının nedeni hibernate’in object caching yöntemi ile yakından ilgilidir. Hibernate gözü ile olaya bakıldığında session objesi birincil ve kullanılması zorunlu cache olarak değerlendirilmekte ve hibernate tarafından manage edilen tüm objeler grafları ile birlikte (taşıdıkları diğer obje referansları ve referansların taşıdıkları referanslar … ) zamanı ve yeri geldikçe (thanks to reflection) session’a yüklenmektedir. Bu nedenle özellikle çok fazla sayıda objenin uzun süreli olarak session’da tutulması özellikle winform uygulamalarımızda gözle görülür bir performans sorununa neden olacaktır.

Posted in: .NET Development , NHibernate  Tags: