From: <jer...@us...> - 2008-08-20 17:35:38
|
Revision: 144 http://structuremap.svn.sourceforge.net/structuremap/?rev=144&view=rev Author: jeremydmiller Date: 2008-08-20 17:35:32 +0000 (Wed, 20 Aug 2008) Log Message: ----------- got the build stack thing working Modified Paths: -------------- trunk/Source/StructureMap/BuildSession.cs trunk/Source/StructureMap/Pipeline/BuildFrame.cs trunk/Source/StructureMap/Pipeline/BuildStack.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs trunk/Source/StructureMap/Pipeline/DefaultInstance.cs trunk/Source/StructureMap/Pipeline/Instance.cs trunk/Source/StructureMap/Pipeline/ReferencedInstance.cs trunk/Source/StructureMap/Pipeline/SmartInstance.cs trunk/Source/StructureMap.Testing/BuildSessionTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/InterceptorTesting.cs trunk/Source/StructureMap.Testing/Pipeline/BuildStackTester.cs trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs Modified: trunk/Source/StructureMap/BuildSession.cs =================================================================== --- trunk/Source/StructureMap/BuildSession.cs 2008-08-19 18:03:10 UTC (rev 143) +++ trunk/Source/StructureMap/BuildSession.cs 2008-08-20 17:35:32 UTC (rev 144) @@ -124,7 +124,12 @@ get { return _buildStack; } } + public Type ParentType + { + get { return _buildStack.Parent.ConcreteType; } + } + private IInstanceFactory forType(Type pluginType) { return _pipelineGraph.ForType(pluginType); Modified: trunk/Source/StructureMap/Pipeline/BuildFrame.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/BuildFrame.cs 2008-08-19 18:03:10 UTC (rev 143) +++ trunk/Source/StructureMap/Pipeline/BuildFrame.cs 2008-08-20 17:35:32 UTC (rev 144) @@ -29,5 +29,59 @@ { get { return _concreteType; } } + + private BuildFrame _parent; + private BuildFrame _next; + + internal void Attach(BuildFrame next) + { + _next = next; + _next._parent = this; + } + + internal BuildFrame Detach() + { + if (_parent != null) _parent._next = null; + return _parent; + } + + internal BuildFrame Parent + { + get + { + return _parent; + } + } + + public override string ToString() + { + return string.Format("RequestedType: {0}, Name: {1}, ConcreteType: {2}", _requestedType, _name, _concreteType); + } + + public bool Equals(BuildFrame obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + return Equals(obj._requestedType, _requestedType) && Equals(obj._name, _name) && Equals(obj._concreteType, _concreteType); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != typeof (BuildFrame)) return false; + return Equals((BuildFrame) obj); + } + + public override int GetHashCode() + { + unchecked + { + int result = (_requestedType != null ? _requestedType.GetHashCode() : 0); + result = (result*397) ^ (_name != null ? _name.GetHashCode() : 0); + result = (result*397) ^ (_concreteType != null ? _concreteType.GetHashCode() : 0); + return result; + } + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/BuildStack.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/BuildStack.cs 2008-08-19 18:03:10 UTC (rev 143) +++ trunk/Source/StructureMap/Pipeline/BuildStack.cs 2008-08-20 17:35:32 UTC (rev 144) @@ -4,8 +4,8 @@ { public class BuildStack { - private readonly Stack<BuildFrame> _frameStack = new Stack<BuildFrame>(); private BuildFrame _root; + private BuildFrame _current; internal BuildStack() { @@ -19,18 +19,34 @@ public BuildFrame Current { - get { return _frameStack.Peek(); } + get { return _current; } } + public BuildFrame Parent + { + get + { + return _current.Parent; + } + } + internal void Push(BuildFrame frame) { - if (_root == null) _root = frame; - _frameStack.Push(frame); + if (_root == null) + { + _root = _current = frame; + } + else + { + _current.Attach(frame); + _current = frame; + } } internal void Pop() { - _frameStack.Pop(); + _current = _current.Detach(); + if (_current == null) _root = null; } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs 2008-08-19 18:03:10 UTC (rev 143) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs 2008-08-20 17:35:32 UTC (rev 144) @@ -149,7 +149,7 @@ return _properties.ContainsKey(propertyName) || _children.ContainsKey(propertyName) || _arrays.ContainsKey(propertyName); } - protected override Type getConcreteType() + protected override Type getConcreteType(Type pluginType) { return _pluggedType; } Modified: trunk/Source/StructureMap/Pipeline/DefaultInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/DefaultInstance.cs 2008-08-19 18:03:10 UTC (rev 143) +++ trunk/Source/StructureMap/Pipeline/DefaultInstance.cs 2008-08-20 17:35:32 UTC (rev 144) @@ -18,5 +18,10 @@ { return "Default"; } + + protected override bool doesRecordOnTheStack + { + get { return false; } + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/Instance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/Instance.cs 2008-08-19 18:03:10 UTC (rev 143) +++ trunk/Source/StructureMap/Pipeline/Instance.cs 2008-08-20 17:35:32 UTC (rev 144) @@ -37,14 +37,35 @@ public virtual object Build(Type pluginType, BuildSession session) { - session.BuildStack.Push(new BuildFrame(pluginType, Name, getConcreteType())); + markBuildStackStart(session, pluginType); + object rawValue = createRawObject(pluginType, session); var finalValue = applyInterception(rawValue, pluginType); - session.BuildStack.Pop(); + markBuildStackFinish(session); + return finalValue; } + protected virtual void markBuildStackFinish(BuildSession session) + { + if (!doesRecordOnTheStack) return; + + session.BuildStack.Pop(); + } + + protected virtual void markBuildStackStart(BuildSession session, Type pluginType) + { + if (!doesRecordOnTheStack) return; + + session.BuildStack.Push(new BuildFrame(pluginType, Name, getConcreteType(pluginType))); + } + + protected virtual bool doesRecordOnTheStack + { + get { return true; } + } + private object createRawObject(Type pluginType, BuildSession session) { try @@ -98,12 +119,12 @@ Type IDiagnosticInstance.ConcreteType { - get { return getConcreteType(); } + get { return getConcreteType(null); } } - protected virtual Type getConcreteType() + protected virtual Type getConcreteType(Type pluginType) { - return null; + return pluginType; } protected virtual void addTemplatedInstanceTo(PluginFamily family, Type[] templateTypes) Modified: trunk/Source/StructureMap/Pipeline/ReferencedInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ReferencedInstance.cs 2008-08-19 18:03:10 UTC (rev 143) +++ trunk/Source/StructureMap/Pipeline/ReferencedInstance.cs 2008-08-20 17:35:32 UTC (rev 144) @@ -68,5 +68,10 @@ { return string.Format("\"{0}\"", _referenceKey); } + + protected override bool doesRecordOnTheStack + { + get { return false; } + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/SmartInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/SmartInstance.cs 2008-08-19 18:03:10 UTC (rev 143) +++ trunk/Source/StructureMap/Pipeline/SmartInstance.cs 2008-08-20 17:35:32 UTC (rev 144) @@ -47,7 +47,7 @@ protected override string getDescription() { - return "Smart Instance for " + getConcreteType().FullName; + return "Smart Instance for " + getConcreteType(null).FullName; } public PropertyExpression<SmartInstance<T>> WithCtorArg(string argumentName) @@ -91,7 +91,7 @@ private string getArgumentNameForType<CTORTYPE>() { - Plugin plugin = PluginCache.GetPlugin(getConcreteType()); + Plugin plugin = PluginCache.GetPlugin(getConcreteType(null)); return plugin.FindArgumentNameForType<CTORTYPE>(); } Modified: trunk/Source/StructureMap.Testing/BuildSessionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/BuildSessionTester.cs 2008-08-19 18:03:10 UTC (rev 143) +++ trunk/Source/StructureMap.Testing/BuildSessionTester.cs 2008-08-20 17:35:32 UTC (rev 144) @@ -166,6 +166,7 @@ } + [Test] public void when_building_an_instance_use_the_register_the_stack_frame() { @@ -175,9 +176,9 @@ session.CreateInstance(typeof (IClassWithRule), instance); - session.BuildStack.Root.ConcreteType.ShouldEqual(typeof (ClassWithRule)); - session.BuildStack.Root.RequestedType.ShouldEqual(typeof (IClassWithRule)); - session.BuildStack.Root.Name.ShouldEqual(instance.Name); + recordingInstance.Root.ConcreteType.ShouldEqual(typeof(ClassWithRule)); + recordingInstance.Root.RequestedType.ShouldEqual(typeof(IClassWithRule)); + recordingInstance.Root.Name.ShouldEqual(instance.Name); recordingInstance.Current.ConcreteType.ShouldEqual(typeof(ColorRule)); recordingInstance.Current.RequestedType.ShouldEqual(typeof(Rule)); @@ -205,7 +206,7 @@ return string.Empty; } - protected override Type getConcreteType() + protected override Type getConcreteType(Type pluginType) { return typeof(ColorRule); } Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/InterceptorTesting.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/InterceptorTesting.cs 2008-08-19 18:03:10 UTC (rev 143) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/InterceptorTesting.cs 2008-08-20 17:35:32 UTC (rev 144) @@ -15,46 +15,23 @@ { _lastService = null; - //_container = new Container(registry => registry.ForRequestedType<IService>().AddInstances - // ( - // Instance<ColorService>() - // .OnCreation<ColorService>(s => _lastService = s) - // .WithName("Intercepted") - // .WithProperty("color").EqualTo("Red"), - // Instance<ColorService>() - // .WithName("NotIntercepted") - // .WithProperty("color").EqualTo("Blue"), - // Object<IService>(new ColorService("Yellow")) - // .WithName("Yellow") - // .OnCreation<ColorService>(s => _lastService = s), - // ConstructedBy<IService>(() => new ColorService("Purple")) - // .WithName("Purple") - // .EnrichWith<IService>(s => new DecoratorService(s)), - // Instance<ColorService>() - // .WithName("Decorated") - // .EnrichWith<IService>(s => new DecoratorService(s)) - // .WithProperty("color").EqualTo("Orange"), - // Object<IService>(new ColorService("Yellow")) - // .WithName("Bad") - // .OnCreation<ColorService>(obj => { throw new ApplicationException("Bad!"); }) - // )); - _container = new Container(r => r.ForRequestedType<IService>().AddInstances(x => { x.OfConcreteType<ColorService>() .OnCreation(s => _lastService = s) .WithName("Intercepted") - .WithProperty("color").EqualTo("Red"); + .WithCtorArg("color").EqualTo("Red"); x.OfConcreteType<ColorService>() .WithName("NotIntercepted") - .WithProperty("color").EqualTo("Blue"); + .WithCtorArg("color").EqualTo("Blue"); x.Object(new ColorService("Yellow")) .WithName("Yellow") .OnCreation<ColorService>(s => _lastService = s); - x.ConstructedBy(() => new ColorService("Purple")).WithName("Purple").EnrichWith<IService>(s => new DecoratorService(s)); + x.ConstructedBy(() => new ColorService("Purple")).WithName("Purple") + .EnrichWith<IService>(s => new DecoratorService(s)); x.OfConcreteType<ColorService>().WithName("Decorated").EnrichWith<IService>(s => new DecoratorService(s)) .WithCtorArg("color").EqualTo("Orange"); Modified: trunk/Source/StructureMap.Testing/Pipeline/BuildStackTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/BuildStackTester.cs 2008-08-19 18:03:10 UTC (rev 143) +++ trunk/Source/StructureMap.Testing/Pipeline/BuildStackTester.cs 2008-08-20 17:35:32 UTC (rev 144) @@ -21,21 +21,24 @@ [Test] public void push_a_new_BuildFrame_onto_the_stack() { - var root = new BuildFrame(typeof(IWidget), "Blue", typeof(ColorWidget)); - var frame1 = new BuildFrame(typeof(IWidget), "Blue", typeof(ColorWidget)); - var frame2 = new BuildFrame(typeof(IWidget), "Blue", typeof(ColorWidget)); + var root = new BuildFrame(typeof(IWidget), "Root", typeof(ColorWidget)); + var frame1 = new BuildFrame(typeof(IWidget), "Frame1", typeof(ColorWidget)); + var frame2 = new BuildFrame(typeof(IWidget), "Frame2", typeof(ColorWidget)); BuildStack stack = new BuildStack(); stack.Push(root); stack.Push(frame1); stack.Current.ShouldBeTheSameAs(frame1); + stack.Parent.ShouldBeTheSameAs(root); stack.Root.ShouldBeTheSameAs(root); stack.Push(frame2); + stack.Parent.ShouldBeTheSameAs(frame1); stack.Current.ShouldBeTheSameAs(frame2); stack.Root.ShouldBeTheSameAs(root); stack.Pop(); + stack.Parent.ShouldBeTheSameAs(root); stack.Current.ShouldBeTheSameAs(frame1); stack.Pop(); stack.Current.ShouldBeTheSameAs(root); Modified: trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs 2008-08-19 18:03:10 UTC (rev 143) +++ trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs 2008-08-20 17:35:32 UTC (rev 144) @@ -222,9 +222,68 @@ container.GetInstance<ClassWithDependency>().Rule.ShouldBeOfType(typeof(ColorRule)); } + + private static Logger createLogger(BuildSession session) + { + return new Logger(session.ParentType); + } + + [Test] + public void AutoFill_a_property_with_contextual_construction() + { + var container = + new Container( + r => + r.FillAllPropertiesOfType<Logger>().TheDefault.Is.ConstructedBy(createLogger)); + + container.GetInstance<ClassWithLogger>().Logger.Type.ShouldEqual(typeof (ClassWithLogger)); + container.GetInstance<ClassWithLogger2>().Logger.Type.ShouldEqual(typeof (ClassWithLogger2)); + + container.GetInstance<ClassWithClassWithLogger>().ClassWithLogger.Logger.Type.ShouldEqual( + typeof (ClassWithLogger)); + } } + public class ClassWithClassWithLogger + { + private readonly ClassWithLogger _classWithLogger; + public ClassWithClassWithLogger(ClassWithLogger classWithLogger) + { + _classWithLogger = classWithLogger; + } + + public ClassWithLogger ClassWithLogger + { + get { return _classWithLogger; } + } + } + + public class Logger + { + private readonly Type _type; + + public Logger(Type type) + { + _type = type; + } + + public Type Type + { + get { return _type; } + } + } + + public class ClassWithLogger + { + public Logger Logger { get; set; } + } + + public class ClassWithLogger2 + { + public Logger Logger { get; set; } + } + public enum ColorEnum { Red, Blue, Green This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |