IBundleOrderer İle Bundle İçerisindeki Dosyaların Sıralanması

Geçtiğimiz haftalarda incelediğim Bundling ve Minification yazısında bir dizin içerisindeki kaynak dosyalarımızı joker karakterler ile bir bundle haline getirip sayfamıza ekleyebileceğimizden bahsetmiştik. Bu dizin içerisindeki tüm dosyalar alfabetik sırada bundle içerisinde işlenir ve referans olarak verilen yerlerde bu sıralamada istemciye sunulur. Çoğu zaman bu tercih edilen bir durum değildir. Bazı temel script dosyalarımızın sayfamızda öncelikli olarak referans verilmesini isteriz. Bu temel script dosyalarını kullanan diğer script dosyalarımız ise sonrasında sayfamıza eklenir. İşte bu kurduğumuz hiyerarşik yapıyı oluşturacağımız bundle'lar içerisinde de yapabilmemiz için ya dosya isimlerini alfabetik olarak yarattığımız hiyerarşiye uyacak şekilde hazırlamamız gerekir ya da IBundleOrderer kullanarak bundle içerisindeki dosyalarımızı sıralayacak bir mekanizma oluşturabiliriz.  Bu yazımda IBundleOrderer interface'ini inceleyerek, basit bir örnek ile bundle içerisindeki script dosyalarımızın hiyerarşisini web.config dosyası içerisinde tanımlayacağımız bir parametre ile yönetmeyi deneyeceğiz.   IBundleOrderer interface'i ve Bundle içerisindeki dosyaların sıralanması Uygulamamız içerisinde oluşturduğumuz Bundle'ların özellikleri arasında Orderer adında bir özellik ile Bundle'ımıza dosyalarını sıralayabileceğimiz bir IBundleOrderer interface'ini uygulayan bir sınıf verebiliyoruz. Bundle myBundle = new Bundle("~/bundles/SiteScripts", new JsMinify()); myBundle.IncludeDirectory("~/Scripts/SiteScripts", "*.js"); myBundle.Orderer = new MyBundleOrderer(); bundles.Add(myBundle); Eğer IBundleOrderer interface'ine gözatarsak eğer OrderFiles metodu ile bundle içerisindeki dosyaları sıralayacak bir metod içeren bir interface olduğunu görüyoruz. Bundle oluşturulurken içerisindeki dosyaları parametre olarak gönderip, dönüş parametresi olarak da sıralanmış dosyaların listesini içeren bir kolleksiyon bekleniyor  :  namespace System.Web.Optimization { public interface IBundleOrderer { IEnumerable<System.IO.FileInfo> OrderFiles(BundleContext context,  IEnumerable<System.IO.FileInfo> files); } } Şimdi yukarıdaki örneğimizde kullandığımız ve IBundleOrderer interface'ini uygulayan sınıfımıza gelecek olursak :  public class MyBundleOrderer : IBundleOrderer { public IEnumerable<System.IO.FileInfo> OrderFiles(BundleContext context, IEnumerable<FileInfo> files) { if (ConfigurationManager.AppSettings["HighPriorityScripts"] != null) { string[] highPriorityScripts = ConfigurationManager.AppSettings["HighPriorityScripts"].Split(','); List<FileInfo> listFiles = new List<FileInfo>(files); List<FileInfo> orderedFiles = new List<FileInfo>(); foreach (string highPriorityFile in highPriorityScripts) { FileInfo nextFileInfo = listFiles.Find(delegate(FileInfo arg) { return arg.Name == highPriorityFile; } ); if (nextFileInfo != null) { orderedFiles.Add(nextFileInfo); } } foreach (FileInfo lowPriorityFile in listFiles) { if (!orderedFiles.Contains(lowPriorityFile)) { orderedFiles.Add(lowPriorityFile); } } return orderedFiles; } return files; } }   <!-- Virgülle ayrılmış script dosyaları --> <add key="HighPriorityScripts" value="Z_HighPriorityScript.js,SmallJSFile.js" />   MyBundleOrderer sınıfı web.config'de yukarıdaki gibi tanımlayacağımız HighPriorityScripts parametresini alıp, öncelik verilecek script dosyalarını belirleyip dönüş yapılacak listeye öncelikli olarak bu dosyaları ekliyor. Sonrasında geriye kalan dosyalar dönüş listesine ekleniyor ve oluşturulan sıralı liste dönülüyor. Böylece bundle'ımız içerisindeki dosyalarımızı web.config dosyasındaki parametremiz ile önceliklendirerek yönetebilir hale gelmiş oluyoruz.