|
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.
|