2016-04-06 11 views
0

MVC'de bir MVC projesi geliştiriyorum, ancak veritabanı değerlerini yükleyen bir işlevim var. Bu işlevi aynı denetleyicinin farklı yerlerinde kullanıyorum. SQL profiler'ı kontrol ettiğimde, bu işlevi kullandığım prosedürü her çalıştırdığında buldum.MVC denetleyicisinde <DataRow> Listesini yüklemek ve yeniden kullanmak için en iyi yol nedir?

Benim sorum, prosedürü ilk kez ve sonraki seferde çağıran işlevi kullanmanın en iyi yoludur, aynı değeri kullanır. Güncel peşin

yılında

Teşekkür:

public List<DataRow> SalesCount() 
{   
    List<DataRow> lstSales = new List<DataRow>(); 
    string str_salesClass = adding session value here;  
    return lstSales = SalesRepository.SalesCount(SessionValue);   
} 
+0

kodunuzu şu ana kadar neler yaptığınızı görebilmemiz için – Theunis

+0

@VadimMartynov, Teşekkürler Vadim, önbellek verileri hakkında fikir sahibi olabilirim, ancak senaryoda, önbellek verisini nasıl uygulayabilirim – ronibd

cevap

1

Controller içine Bunu yapmanın çeşitli yolları vardır. İlk başta bilmelisiniz ki, denetleyiciye her istekte aynı denetleyicinin farklı örneğini kullanıyorsunuz.

İlk olarak: tekil kullanabilme. Herkese açık statik örnekte depolayın, bir kez yükleyin ve her sorduğunuzda aynı listeyi alın. Ancak, veritabanı değerleri olduğu için, veritabanından depolanan değerleri düzenli olarak güncellemeniz gerekir.

public class LoaderSingleton 
{ 
    private static readonly LoaderSingleton _instance = new LoaderSingleton(); 
    private List<DataRow> _items; 
    static LoaderSingleton() 
    { 

    } 

    private LoaderSingleton() 
    { 

    } 

    public static LoaderSingleton Instance 
    { 
     get 
     { 
      return _instance; 
     } 
    } 

    public List<DataRow> Items 
    { 
     get 
     { 
      if (this._items == null) 
      { 
       this.Load(); 
      } 

      return this._items; 
     } 
    } 

    public void Load() 
    { 
     this._items = //perform load from database 
    } 
} 

İkinci yolu: Bir Session değişkeni kullanmak. Değerleri, statik sınıf yerine kullanıcı oturumunda depolayın. Değerleri güncellemeyi ve oturumu temizlemeyi unutmamalısınız.

//inside controller 
this.Session[str_salesClass] = SalesRepository.SalesCount(); 

Üçüncü bir yol: ViewData değişkeni kullanmak. Değer yalnızca talepler arasında saklanır ve son istek tamamlandıktan sonra yeni değerler ile güncellemeniz gerekir.

//inside controller 
this.ViewData[str_salesClass] = SalesRepository.SalesCount(); 

Dördüncü yolu: En görünümden async isteklerini gerçekleştirin. Örneğin, başka bir görüntüyü eşzamansız olarak yükleyebilen ve yük alt görünümü için istek gönderirken, temel görünüm için gerekli değerleri yüklüyorsunuz - yüklenen verileri parametre olarak iletmeniz gerekir. o öngörülemeyen davranışa sahip sebep

public ActionResult BaseView() 
{ 
    ViewBag.Data = SalesRepository.SalesCount(); 
    return View(); 
} 

[ChildActionOnly] 
public ActionResult ChildView1(List<DataRow> sales) 
{ 

} 

Ben Cache kullanmayı önermiyoruz. Ve beklemediğinizde null'u alacaksınız.

+0

Teşekkür ederim Mikhail, ViewData/ViewBag seçeneğini kullanacağım Çok teşekkürler – ronibd

0

SQL sorgusu sonuçları kaydetmek ve bazı parametreler değişiklik veya önbellek değeri geçersiz gereken yalnızca yeni bir istek olması MemoryCache kullanabilirsiniz.

Önbellek parametrelerini yapılandırmak için CacheItemPolicy sınıfını kullanabilirsiniz. Belirli bir süre sonra bir önbellek girdisinin tahliye edilip edilmeyeceğini belirten değeri, önbellek durumunu tetikleyici ve diğer parametreler tarafından geçersiz kılacak ek monitörler yapılandırabilirsiniz.

// your controller field 
private readonly MemoryCache _dbDataCache = MemoryCache.Default; 

// string key for your cached data 
private const string DbDataCacheSalesCountKey = "DbDataCacheSalesCountKey"; 

public List<DataRow> SalesCount() 
{ 
    if(_dbDataCache.Contans(DbDataCacheSalesCountKey)) 
     return _dbDataCache[DbDataCacheSalesCountKey] as List<DataRow>; 

    string str_salesClass = adding session value here; 
    var lstSales = SalesRepository.SalesCount(SessionValue); 

    // save cache only for 10 minutes 
    var cip = new CacheItemPolicy { AbsoluteExpiration = new DateTimeOffset(DateTime.Now.AddMinutes(10)) }; 
    _dbDataCache.Set(DbDataCacheSalesCountKey, lstSales, cip); 
    return lstSales; 
} 

alternatif kod organizasyonu

sonraki benziyor ve aşağıdaki kodu ile aynı şekilde çalışır:

public List<DataRow> SalesCount() 
{ 
    var salesCount = _dbDataCache[DbDataCacheSalesCountKey] as List<DataRow>; 
    if(salesCount == null) 
    { 
     string str_salesClass = adding session value here; 
     salesCount = SalesRepository.SalesCount(SessionValue); 

     // save cache only for 10 minutes 
     var cip = new CacheItemPolicy { AbsoluteExpiration = new DateTimeOffset(DateTime.Now.AddMinutes(10)) }; 
     _dbDataCache.Set(DbDataCacheSalesCountKey, salesCount, cip); 
    } 

    return salesCount; 
} 
+0

Sizin için teşekkür ederiz Vadim yardım, test ettikten sonra, ViewData/ViewBag kullanmak daha iyi olacağını düşünüyorum, Çok teşekkürler – ronibd