9

मैं कुछ गतिशील बंडलिंग के साथ काम कर रहा हूं जो कॉन्फ़िगरेशन के आधार पर सीएसएस और जेएस फाइलों को जोड़ता है।वेब। ऑप्टिमाइज़ेशन - सभी को स्टाइल/स्क्रिप्ट बंडल से प्राप्त करने का कोई तरीका शामिल है?

मैं एक नया StyleBundle ऊपर स्पिन ऐसी है कि:

var cssBundle = new StyleBundle("~/bundle/css"); 

फिर config के माध्यम से लूप और किसी भी मिली जोड़ने में शामिल हैं:

cssBundle.Include(config.Source); 

पाश मैं जाँच करना चाहते हैं अगर वहाँ वास्तव में था किसी भी फाइल के बाद/निर्देशिका शामिल हैं। मुझे पता है कि एन्युमेरेटफाइल() है लेकिन मुझे नहीं लगता कि यह 100% उद्देश्य प्रदान करता है।

किसी और ने पहले कुछ भी किया था?

उत्तर

13

Bundle कक्षा एक आंतरिक आइटम सूची का उपयोग करती है जो एप्लिकेशन पर लागू नहीं होती है, और यह प्रतिबिंब (मैंने कोशिश की और कोई सामग्री नहीं मिल सका) के माध्यम से जरूरी नहीं है। तुम इतनी तरह BundleResolver वर्ग का उपयोग कर इस बारे में कुछ जानकारी प्राप्त कर सके:

int count = resolver.GetBundleContents("~/bundle/css").Count(); 

संपादित करें:: का उपयोग कर प्रतिबिंब

कुछ जाहिरा तौर पर मैंने किया

var cssBundle = new StyleBundle("~/bundle/css"); 
cssBundle.Include(config.Source); 

// if your bundle is already in BundleTable.Bundles list, use that. Otherwise... 
var collection = new BundleCollection(); 
collection.Add(cssBundle) 

// get bundle contents 
var resolver = new BundleResolver(collection); 
List<string> cont = resolver.GetBundleContents("~/bundle/css").ToList(); 

तुम सिर्फ एक गिनती तो की जरूरत है पहले मेरे प्रतिबिंब परीक्षण के साथ गलत है।

यह वास्तव में काम करता है:

using System.Reflection; 
using System.Web.Optimization; 

... 

int count = ((ItemRegistry)typeof(Bundle).GetProperty("Items", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(cssBundle, null)).Count; 

आप शायद कुछ सुरक्षा जाँच वहाँ के पाठ्यक्रम जोड़ना चाहिए, और प्रतिबिंब उदाहरण के एक बहुत की तरह इस Items संपत्ति का उद्देश्य सुरक्षा का उल्लंघन है, लेकिन यह काम करता है।

+0

धन्यवाद कोरी जो अच्छा लग रहा है, केवल मेरे पास यह मुद्दा है कि संग्रह की गणना के लिए संग्रह में बंडल जोड़ा जा रहा है। आदर्श रूप से मैं संग्रह में जोड़ने से पहले> 0 सुनिश्चित करने के लिए सामग्री जांचना चाहता हूं। क्या इसका कोई मतलब है? – timothyclifford

+0

आप गिनती प्राप्त करने के लिए प्रतिबिंब उदाहरण का उपयोग कर सकते हैं, या एक नया (और अस्थायी) संग्रह बना सकते हैं जैसा कि मैंने उपरोक्त प्रारंभिक कोड नमूने में किया था और शामिल फ़ाइलों की सूची प्राप्त करने के लिए 'बंडलरोलॉल्वर'' का उपयोग किया था। जब तक आप इसे 'BundleTable.Bundles' संग्रह में नहीं जोड़ते हैं, तब तक बंडल शेष सिस्टम तक उपलब्ध नहीं होता है, ताकि आप इसे आम तौर पर उपलब्ध कराने से पहले बंडल की जांच करने के लिए किसी भी विधि का उपयोग कर सकें। – Corey

+0

आइटम रजिस्ट्री आंतरिक नहीं है हालांकि? – timothyclifford

1

आप Bundle निम्नलिखित विस्तार तरीकों का उपयोग कर सकते हैं:

public static class BundleHelper 
{ 
    private static Dictionary<Bundle, List<string>> bundleIncludes = new Dictionary<Bundle, List<string>>(); 
    private static Dictionary<Bundle, List<string>> bundleFiles = new Dictionary<Bundle, List<string>>(); 

    private static void EnumerateFiles(Bundle bundle, string virtualPath) 
    { 
     if (bundleIncludes.ContainsKey(bundle)) 
      bundleIncludes[bundle].Add(virtualPath); 
     else 
      bundleIncludes.Add(bundle, new List<string> { virtualPath }); 

     int i = virtualPath.LastIndexOf('/'); 
     string path = HostingEnvironment.MapPath(virtualPath.Substring(0, i)); 

     if (Directory.Exists(path)) 
     { 
      string fileName = virtualPath.Substring(i + 1); 
      IEnumerable<string> fileList; 

      if (fileName.Contains("{version}")) 
      { 
       var re = new Regex(fileName.Replace(".", @"\.").Replace("{version}", @"(\d+(?:\.\d+){1,3})")); 
       fileName = fileName.Replace("{version}", "*"); 
       fileList = Directory.EnumerateFiles(path, fileName).Where(file => re.IsMatch(file)); 
      } 
      else // fileName may contain '*' 
       fileList = Directory.EnumerateFiles(path, fileName); 

      if (bundleFiles.ContainsKey(bundle)) 
       bundleFiles[bundle].AddRange(fileList); 
      else 
       bundleFiles.Add(bundle, fileList.ToList()); 
     } 
    } 

    public static Bundle Add(this Bundle bundle, params string[] virtualPaths) 
    { 
     foreach (string virtualPath in virtualPaths) 
      EnumerateFiles(bundle, virtualPath); 

     return bundle.Include(virtualPaths); 
    } 

    public static Bundle Add(this Bundle bundle, string virtualPath, params IItemTransform[] transforms) 
    { 
     EnumerateFiles(bundle, virtualPath); 
     return bundle.Include(virtualPath, transforms); 
    } 

    public static IEnumerable<string> EnumerateIncludes(this Bundle bundle) 
    { 
     return bundleIncludes[bundle]; 
    } 

    public static IEnumerable<string> EnumerateFiles(this Bundle bundle) 
    { 
     return bundleFiles[bundle]; 
    } 
} 

इसके बाद अपने Include() कॉल Add() के साथ बदलें: आप भी IncludeDirectory() उपयोग कर रहे हैं, बस पूरा

var bundle = new ScriptBundle("~/test") 
    .Add("~/Scripts/jquery/jquery-{version}.js") 
    .Add("~/Scripts/lib*") 
    .Add("~/Scripts/model.js") 
    ); 

var includes = bundle.EnumerateIncludes(); 
var files = bundle.EnumerateFiles(); 

एक संबंधित AddDirectory() विस्तार विधि जोड़कर उदाहरण।

+1

वास्तव में बंडल कक्षा में एक 'एन्युमेरेटफाइल' विधि बनाई गई है। यह बंडलफाइल ऑब्जेक्ट्स की एक सूची लौटाएगा, जो आपको न केवल प्रत्येक फ़ाइल के पथ तक पहुंच प्रदान करता है, बल्कि प्रत्येक फ़ाइल के IItemTransform (ओं), यदि कोई हो, तो लागू होता है। – Triynko

संबंधित मुद्दे

 संबंधित मुद्दे