1 // 2 // System.Web.Compilation.AggregateCacheDependency 3 // 4 // Authors: 5 // Marek Habersack (grendello@gmail.com) 6 // 7 // (C) 2006 Marek Habersack 8 // 9 // 10 // Permission is hereby granted, free of charge, to any person obtaining 11 // a copy of this software and associated documentation files (the 12 // "Software"), to deal in the Software without restriction, including 13 // without limitation the rights to use, copy, modify, merge, publish, 14 // distribute, sublicense, and/or sell copies of the Software, and to 15 // permit persons to whom the Software is furnished to do so, subject to 16 // the following conditions: 17 // 18 // The above copyright notice and this permission notice shall be 19 // included in all copies or substantial portions of the Software. 20 // 21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 28 // 29 30 using System; 31 using System.Collections.Generic; 32 using System.Text; 33 using System.Web; 34 35 namespace System.Web.Caching 36 { 37 public sealed class AggregateCacheDependency : CacheDependency 38 { 39 object dependenciesLock = new object(); 40 List <CacheDependency> dependencies; 41 AggregateCacheDependency()42 public AggregateCacheDependency () 43 { 44 FinishInit (); 45 } 46 Add(params CacheDependency [] dependencies)47 public void Add (params CacheDependency [] dependencies) 48 { 49 if (dependencies == null) 50 throw new ArgumentNullException ("dependencies"); 51 if (dependencies.Length == 0) 52 return; 53 54 bool somethingChanged = false; 55 foreach (CacheDependency dep in dependencies) 56 if (dep == null || dep.IsUsed) 57 throw new InvalidOperationException ("Cache dependency already in use"); 58 else if (!somethingChanged && dep != null && dep.HasChanged) 59 somethingChanged = true; 60 61 lock (dependenciesLock) { 62 if (this.dependencies == null) 63 this.dependencies = new List <CacheDependency> (dependencies.Length); 64 foreach (CacheDependency dep in dependencies) 65 if (dep != null) 66 dep.DependencyChanged += new EventHandler (OnAnyChanged); 67 68 this.dependencies.AddRange (dependencies); 69 base.Start = DateTime.UtcNow; 70 } 71 if (somethingChanged) 72 base.NotifyDependencyChanged (this, null); 73 } 74 GetUniqueID()75 public override string GetUniqueID () 76 { 77 if (dependencies == null || dependencies.Count == 0) 78 return null; 79 80 StringBuilder sb = new StringBuilder (); 81 lock (dependenciesLock) { 82 string depid = null; 83 foreach (CacheDependency dep in dependencies) { 84 depid = dep.GetUniqueID (); 85 if (String.IsNullOrEmpty (depid)) 86 return null; 87 sb.Append (depid); 88 sb.Append (';'); 89 } 90 } 91 return sb.ToString (); 92 } 93 DependencyDispose()94 protected override void DependencyDispose () 95 { 96 // MSDN doesn't document it as being part of the class, but assembly 97 // comparison shows that it does exist in this type, so we're just calling 98 // the base class here 99 base.DependencyDispose (); 100 } 101 DependencyDisposeInternal()102 internal override void DependencyDisposeInternal () 103 { 104 if (dependencies != null && dependencies.Count > 0) 105 foreach (CacheDependency dep in dependencies) 106 dep.DependencyChanged -= new EventHandler (OnAnyChanged); 107 } 108 OnAnyChanged(object sender, EventArgs args)109 void OnAnyChanged (object sender, EventArgs args) 110 { 111 base.NotifyDependencyChanged (sender, args); 112 } 113 } 114 } 115 116 117 118