From: <cm...@us...> - 2008-07-19 23:43:16
|
Revision: 127 http://structuremap.svn.sourceforge.net/structuremap/?rev=127&view=rev Author: cmyers Date: 2008-07-19 23:43:04 +0000 (Sat, 19 Jul 2008) Log Message: ----------- Added some tests around using a non-intrinsic value type (for example, System.Guid) as a child parameter to a plugged type (i.e. class Foo with ctor like: public Foo(Guid someGuid)). Fixed a bug in the ParameterEmitter.cast() method that assumed the ParameterType was a reference type. For value types, you must use the Unbox_Any IL opcode. For reference types, Castcall must be used. For more context, see Paul Segaro's post on the Sm-user's mailing list here: http://groups.google.com/group/structuremap-users/browse_thread/thread/34ddaf549ebb14f7?hl=en Modified Paths: -------------- trunk/Source/StructureMap/Emitting/Parameters/ParameterEmitter.cs trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs trunk/Source/StructureMap.Testing/StructureMapConfigurationTester.cs Modified: trunk/Source/StructureMap/Emitting/Parameters/ParameterEmitter.cs =================================================================== --- trunk/Source/StructureMap/Emitting/Parameters/ParameterEmitter.cs 2008-07-10 20:49:46 UTC (rev 126) +++ trunk/Source/StructureMap/Emitting/Parameters/ParameterEmitter.cs 2008-07-19 23:43:04 UTC (rev 127) @@ -20,7 +20,19 @@ protected void cast(ILGenerator ilgen, Type parameterType) { - ilgen.Emit(OpCodes.Castclass, parameterType); + //NOTE: According to the docs, Unbox_Any, when called on a ref type, will just do a Castclass + // but it's probably better to err on the side of being explicit rather than relying + // on non-obvious side effects + + if( parameterType.IsValueType ) + { + ilgen.Emit(OpCodes.Unbox_Any, parameterType); + } + else + { + ilgen.Emit(OpCodes.Castclass, parameterType); + } + } } } \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs 2008-07-10 20:49:46 UTC (rev 126) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs 2008-07-19 23:43:04 UTC (rev 127) @@ -233,6 +233,16 @@ Assert.IsInstanceOfType(typeof (DefaultGateway), gateway); } + + [Test(Description = "Guid test based on problems encountered by Paul Segaro. See http://groups.google.com/group/structuremap-users/browse_thread/thread/34ddaf549ebb14f7?hl=en")] + public void TheDefaultInstanceIsALambdaForGuidNewGuid() + { + Container manager = + new Container( + registry => registry.ForRequestedType<Guid>().TheDefaultIs(()=>Guid.NewGuid())); + + Assert.IsInstanceOfType(typeof(Guid), manager.GetInstance<Guid>()); + } } public class StubbedInstanceFactoryInterceptor : IBuildInterceptor Modified: trunk/Source/StructureMap.Testing/StructureMapConfigurationTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/StructureMapConfigurationTester.cs 2008-07-10 20:49:46 UTC (rev 126) +++ trunk/Source/StructureMap.Testing/StructureMapConfigurationTester.cs 2008-07-19 23:43:04 UTC (rev 127) @@ -120,8 +120,44 @@ PluginGraph graph = StructureMapConfiguration.GetPluginGraph(); Assert.IsTrue(graph.FamilyCount > 0); } + + [Test(Description = "Guid test based on problems encountered by Paul Segaro. See http://groups.google.com/group/structuremap-users/browse_thread/thread/34ddaf549ebb14f7?hl=en")] + public void TheDefaultInstanceIsALambdaForGuidNewGuid() + { + StructureMapConfiguration.ResetAll(); + StructureMapConfiguration.IgnoreStructureMapConfig = true; + + StructureMapConfiguration.ForRequestedType<Guid>().TheDefaultIs(() => Guid.NewGuid()); + + Assert.That(ObjectFactory.GetInstance<Guid>() != Guid.Empty); + } + + [Test(Description = "Guid test based on problems encountered by Paul Segaro. See http://groups.google.com/group/structuremap-users/browse_thread/thread/34ddaf549ebb14f7?hl=en")] + public void TheDefaultInstance_has_a_dependency_upon_a_Guid_NewGuid_lambda_generated_instance() + { + StructureMapConfiguration.ResetAll(); + StructureMapConfiguration.IgnoreStructureMapConfig = true; + + StructureMapConfiguration.ForRequestedType<Guid>().TheDefaultIs(() => Guid.NewGuid()); + StructureMapConfiguration.ForRequestedType<IFoo>().TheDefaultIsConcreteType<Foo>(); + + Assert.That(ObjectFactory.GetInstance<IFoo>().SomeGuid != Guid.Empty); + } } + public interface IFoo { Guid SomeGuid { get; set; } } + + public class Foo : IFoo + { + public Foo(Guid someGuid) + { + SomeGuid = someGuid; + } + + public Guid SomeGuid { get; set; } + + } + public interface ISomething { } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2008-07-27 14:01:52
|
Revision: 128 http://structuremap.svn.sourceforge.net/structuremap/?rev=128&view=rev Author: jeremydmiller Date: 2008-07-27 14:01:47 +0000 (Sun, 27 Jul 2008) Log Message: ----------- refactoring to get ready for "Optional" setter injection Modified Paths: -------------- trunk/Source/StructureMap/Emitting/ArgumentEmitter.cs trunk/Source/StructureMap/Emitting/Parameters/PrimitiveParameterEmitter.cs trunk/Source/StructureMap/Graph/IArgumentVisitor.cs trunk/Source/StructureMap/Graph/SetterProperty.cs trunk/Source/StructureMap/Graph/SetterPropertyCollection.cs trunk/Source/StructureMap/InstanceMemento.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs trunk/Source/StructureMap/Pipeline/IConfiguredInstance.cs trunk/Source/StructureMap/Pipeline/InstanceMementoPropertyReader.cs trunk/Source/StructureMap/StructureMap.csproj trunk/Source/StructureMap/StructureMapException.resx trunk/Source/StructureMap.Testing/Configuration/DSL/GenericFamilyExpressionTester.cs trunk/Source/StructureMap.Testing/Graph/GenericsPluginGraphTester.cs trunk/Source/StructureMap.Testing/Graph/PluginTester.cs trunk/Source/StructureMap.Testing/Graph/SetterInjectionEmittingTester.cs trunk/Source/StructureMap.Testing/Graph/SetterInjectionTester.cs trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs trunk/Source/StructureMap.Testing.Widget2/EnumerationCheck.cs Added Paths: ----------- trunk/Source/StructureMap/ReflectionHelper.cs Modified: trunk/Source/StructureMap/Emitting/ArgumentEmitter.cs =================================================================== --- trunk/Source/StructureMap/Emitting/ArgumentEmitter.cs 2008-07-19 23:43:04 UTC (rev 127) +++ trunk/Source/StructureMap/Emitting/ArgumentEmitter.cs 2008-07-27 14:01:47 UTC (rev 128) @@ -22,28 +22,38 @@ #region IArgumentVisitor Members - public void PrimitiveSetter(PropertyInfo property) + public void PrimitiveSetter(PropertyInfo property, bool isMandatory) { + if (!isMandatory) return; + _primitive.Setter(ilgen, property); } - public void StringSetter(PropertyInfo property) + public void StringSetter(PropertyInfo property, bool isMandatory) { + if (!isMandatory) return; + _string.Setter(ilgen, property); } - public void EnumSetter(PropertyInfo property) + public void EnumSetter(PropertyInfo property, bool isMandatory) { + if (!isMandatory) return; + _enum.Setter(ilgen, property); } - public void ChildSetter(PropertyInfo property) + public void ChildSetter(PropertyInfo property, bool isMandatory) { + if (!isMandatory) return; + _child.Setter(ilgen, property); } - public void ChildArraySetter(PropertyInfo property) + public void ChildArraySetter(PropertyInfo property, bool isMandatory) { + if (!isMandatory) return; + _childArray.Setter(ilgen, property); } Modified: trunk/Source/StructureMap/Emitting/Parameters/PrimitiveParameterEmitter.cs =================================================================== --- trunk/Source/StructureMap/Emitting/Parameters/PrimitiveParameterEmitter.cs 2008-07-19 23:43:04 UTC (rev 127) +++ trunk/Source/StructureMap/Emitting/Parameters/PrimitiveParameterEmitter.cs 2008-07-27 14:01:47 UTC (rev 128) @@ -21,7 +21,7 @@ { BindingFlags bindingAttr = BindingFlags.Static | BindingFlags.Public; MethodInfo parseMethod = - argumentType.GetMethod("Parse", bindingAttr, null, new Type[] {typeof (string)}, null); + argumentType.GetMethod("Parse", bindingAttr, null, new [] {typeof (string)}, null); ilgen.Emit(OpCodes.Call, parseMethod); } Modified: trunk/Source/StructureMap/Graph/IArgumentVisitor.cs =================================================================== --- trunk/Source/StructureMap/Graph/IArgumentVisitor.cs 2008-07-19 23:43:04 UTC (rev 127) +++ trunk/Source/StructureMap/Graph/IArgumentVisitor.cs 2008-07-27 14:01:47 UTC (rev 128) @@ -4,11 +4,11 @@ { public interface IArgumentVisitor { - void PrimitiveSetter(PropertyInfo property); - void StringSetter(PropertyInfo property); - void EnumSetter(PropertyInfo property); - void ChildSetter(PropertyInfo property); - void ChildArraySetter(PropertyInfo property); + void PrimitiveSetter(PropertyInfo property, bool isMandatory); + void StringSetter(PropertyInfo property, bool isMandatory); + void EnumSetter(PropertyInfo property, bool isMandatory); + void ChildSetter(PropertyInfo property, bool isMandatory); + void ChildArraySetter(PropertyInfo property, bool isMandatory); void PrimitiveParameter(ParameterInfo parameter); void StringParameter(ParameterInfo parameter); Modified: trunk/Source/StructureMap/Graph/SetterProperty.cs =================================================================== --- trunk/Source/StructureMap/Graph/SetterProperty.cs 2008-07-19 23:43:04 UTC (rev 127) +++ trunk/Source/StructureMap/Graph/SetterProperty.cs 2008-07-27 14:01:47 UTC (rev 128) @@ -1,5 +1,6 @@ using System; using System.Reflection; +using StructureMap.Attributes; namespace StructureMap.Graph { @@ -10,9 +11,13 @@ { private readonly PropertyInfo _property; + public SetterProperty(PropertyInfo property) : base() { _property = property; + var att = Attribute.GetCustomAttribute(property, typeof (SetterPropertyAttribute)); + + IsMandatory = att != null; } public PropertyInfo Property @@ -25,6 +30,8 @@ get { return _property.Name; } } + public bool IsMandatory { get; set; } + public bool CanBeAutoFilled { get { return IsAutoFillable(_property.PropertyType); } @@ -34,11 +41,11 @@ { Type propertyType = _property.PropertyType; - if (IsPrimitive(propertyType)) visitor.PrimitiveSetter(_property); - if (IsChild(propertyType)) visitor.ChildSetter(_property); - if (IsChildArray(propertyType)) visitor.ChildArraySetter(_property); - if (IsEnum(propertyType)) visitor.EnumSetter(_property); - if (IsString(propertyType)) visitor.StringSetter(_property); + if (IsPrimitive(propertyType)) visitor.PrimitiveSetter(_property, IsMandatory); + if (IsChild(propertyType)) visitor.ChildSetter(_property, IsMandatory); + if (IsChildArray(propertyType)) visitor.ChildArraySetter(_property, IsMandatory); + if (IsEnum(propertyType)) visitor.EnumSetter(_property, IsMandatory); + if (IsString(propertyType)) visitor.StringSetter(_property, IsMandatory); } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Graph/SetterPropertyCollection.cs =================================================================== --- trunk/Source/StructureMap/Graph/SetterPropertyCollection.cs 2008-07-19 23:43:04 UTC (rev 127) +++ trunk/Source/StructureMap/Graph/SetterPropertyCollection.cs 2008-07-27 14:01:47 UTC (rev 128) @@ -1,3 +1,4 @@ +using System; using System.Collections; using System.Collections.Generic; using System.Reflection; @@ -11,42 +12,40 @@ public class SetterPropertyCollection : IEnumerable<SetterProperty> { private readonly Plugin _plugin; - private Dictionary<string, SetterProperty> _properties; + private List<SetterProperty> _properties; public SetterPropertyCollection(Plugin plugin) { - _properties = new Dictionary<string, SetterProperty>(); + _properties = new List<SetterProperty>(); _plugin = plugin; - PropertyInfo[] properties = SetterPropertyAttribute.FindMarkedProperties(plugin.PluggedType); - foreach (PropertyInfo property in properties) + + foreach (PropertyInfo property in plugin.PluggedType.GetProperties()) { - addSetterProperty(property, property.Name); + if (property.CanWrite) + { + SetterProperty setter = new SetterProperty(property); + _properties.Add(setter); + } } } - public SetterProperty[] Setters + public int MandatoryCount { - get - { - SetterProperty[] returnValue = new SetterProperty[_properties.Count]; - _properties.Values.CopyTo(returnValue, 0); - - return returnValue; - } + get { return _properties.FindAll(p => p.IsMandatory).Count; } } - public int Count + public int OptionalCount { - get { return _properties.Count; } + get { return _properties.FindAll(p => !p.IsMandatory).Count; } } #region IEnumerable<SetterProperty> Members IEnumerator<SetterProperty> IEnumerable<SetterProperty>.GetEnumerator() { - return _properties.Values.GetEnumerator(); + return _properties.GetEnumerator(); } public IEnumerator GetEnumerator() @@ -58,38 +57,35 @@ public SetterProperty Add(string propertyName) { - PropertyInfo property = _plugin.PluggedType.GetProperty(propertyName); - addSetterProperty(property, propertyName); + var setter = _properties.Find(p => p.Property.Name == propertyName); + if (setter == null) + { + throw new StructureMapException(240, propertyName, _plugin.PluggedType); + } - return _properties[propertyName]; + + setter.IsMandatory = true; + + return setter; } - private void addSetterProperty(PropertyInfo property, string propertyName) + + public bool IsMandatory(string propertyName) { + SetterProperty property = _properties.Find(p => p.Name == propertyName); if (property == null) { - throw new StructureMapException(240, propertyName, _plugin.PluggedType); + return false; } - if (property.GetSetMethod() == null) - { - throw new StructureMapException(241, propertyName, _plugin.PluggedType); - } - - SetterProperty setterProperty = new SetterProperty(property); - _properties.Add(propertyName, setterProperty); + return property.IsMandatory; } - public bool Contains(string propertyName) - { - return _properties.ContainsKey(propertyName); - } - public void Merge(SetterPropertyCollection setters) { foreach (SetterProperty setter in setters) { - if (!Contains(setter.Name)) + if (!IsMandatory(setter.Name)) { Add(setter.Name); } @@ -110,7 +106,10 @@ foreach (SetterProperty setterProperty in this) { - returnValue = returnValue && setterProperty.CanBeAutoFilled; + if (setterProperty.IsMandatory) + { + returnValue = returnValue && setterProperty.CanBeAutoFilled; + } } return returnValue; Modified: trunk/Source/StructureMap/InstanceMemento.cs =================================================================== --- trunk/Source/StructureMap/InstanceMemento.cs 2008-07-19 23:43:04 UTC (rev 127) +++ trunk/Source/StructureMap/InstanceMemento.cs 2008-07-27 14:01:47 UTC (rev 128) @@ -121,17 +121,14 @@ try { returnValue = getPropertyValue(Key); + } catch (Exception ex) { throw new StructureMapException(205, ex, Key, InstanceKey); } - if (returnValue == string.Empty || returnValue == null) - { - throw new StructureMapException(205, Key, InstanceKey); - } - + if (string.IsNullOrEmpty(returnValue)) return null; if (returnValue.ToUpper() == EMPTY_STRING) { returnValue = string.Empty; Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs 2008-07-19 23:43:04 UTC (rev 127) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs 2008-07-27 14:01:47 UTC (rev 128) @@ -187,5 +187,13 @@ return typeName; } } + + public void ForProperty(string propertyName, Action<string> action) + { + if (_properties.ContainsKey(propertyName)) + { + action(_properties[propertyName]); + } + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/IConfiguredInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/IConfiguredInstance.cs 2008-07-19 23:43:04 UTC (rev 127) +++ trunk/Source/StructureMap/Pipeline/IConfiguredInstance.cs 2008-07-27 14:01:47 UTC (rev 128) @@ -11,5 +11,6 @@ string GetProperty(string propertyName); object GetChild(string propertyName, Type pluginType, IBuildSession buildSession); object Build(Type pluginType, IBuildSession session, InstanceBuilder builder); + void ForProperty(string propertyName, Action<string> action); } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/InstanceMementoPropertyReader.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/InstanceMementoPropertyReader.cs 2008-07-19 23:43:04 UTC (rev 127) +++ trunk/Source/StructureMap/Pipeline/InstanceMementoPropertyReader.cs 2008-07-27 14:01:47 UTC (rev 128) @@ -22,49 +22,49 @@ #region IArgumentVisitor Members - public void PrimitiveSetter(PropertyInfo property) + public void PrimitiveSetter(PropertyInfo property, bool isMandatory) { - copyPrimitive(property.Name); + copyPrimitive(property.Name, isMandatory); } - public void StringSetter(PropertyInfo property) + public void StringSetter(PropertyInfo property, bool isMandatory) { - copyPrimitive(property.Name); + copyPrimitive(property.Name, isMandatory); } - public void EnumSetter(PropertyInfo property) + public void EnumSetter(PropertyInfo property, bool isMandatory) { - copyPrimitive(property.Name); + copyPrimitive(property.Name, isMandatory); } - public void ChildSetter(PropertyInfo property) + public void ChildSetter(PropertyInfo property, bool isMandatory) { - copyChild(property.Name, property.PropertyType); + copyChild(property.Name, property.PropertyType, isMandatory); } - public void ChildArraySetter(PropertyInfo property) + public void ChildArraySetter(PropertyInfo property, bool isMandatory) { copyChildArray(property.Name, property.PropertyType.GetElementType()); } public void PrimitiveParameter(ParameterInfo parameter) { - copyPrimitive(parameter.Name); + copyPrimitive(parameter.Name, true); } public void StringParameter(ParameterInfo parameter) { - copyPrimitive(parameter.Name); + copyPrimitive(parameter.Name, true); } public void EnumParameter(ParameterInfo parameter) { - copyPrimitive(parameter.Name); + copyPrimitive(parameter.Name, true); } public void ChildParameter(ParameterInfo parameter) { - copyChild(parameter.Name, parameter.ParameterType); + copyChild(parameter.Name, parameter.ParameterType, true); } public void ChildArrayParameter(ParameterInfo parameter) @@ -74,16 +74,20 @@ #endregion - private void copyPrimitive(string name) + private void copyPrimitive(string name, bool isMandatory) { - _instance.SetProperty(name, _memento.GetProperty(name)); + string propertyValue = _memento.GetProperty(name); + + if (propertyValue == null && isMandatory) + { + throw new StructureMapException(205, name, _memento.InstanceKey); + } + + _instance.SetProperty(name, propertyValue); } - private void copyChild(string name, Type childType) + private void copyChild(string name, Type childType, bool isMandatory) { - //InstanceMemento child = _memento.GetChildMemento(name); - //Instance childInstance = child == null ? new DefaultInstance() : child.ReadInstance(_pluginGraph, childType); - Instance childInstance = _memento.ReadChildInstance(name, _pluginGraph, childType) ?? new DefaultInstance(); _instance.Child(name).Is(childInstance); Added: trunk/Source/StructureMap/ReflectionHelper.cs =================================================================== --- trunk/Source/StructureMap/ReflectionHelper.cs (rev 0) +++ trunk/Source/StructureMap/ReflectionHelper.cs 2008-07-27 14:01:47 UTC (rev 128) @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using System.Text; + +namespace StructureMap +{ + public static class ReflectionHelper + { + public static PropertyInfo GetProperty<MODEL>(Expression<Func<MODEL, object>> expression) + { + MemberExpression memberExpression = getMemberExpression(expression); + return (PropertyInfo)memberExpression.Member; + } + + public static PropertyInfo GetProperty<MODEL, T>(Expression<Func<MODEL, T>> expression) + { + MemberExpression memberExpression = getMemberExpression(expression); + return (PropertyInfo)memberExpression.Member; + } + + private static MemberExpression getMemberExpression<MODEL, T>(Expression<Func<MODEL, T>> expression) + { + MemberExpression memberExpression = null; + if (expression.Body.NodeType == ExpressionType.Convert) + { + var body = (UnaryExpression)expression.Body; + memberExpression = body.Operand as MemberExpression; + } + else if (expression.Body.NodeType == ExpressionType.MemberAccess) + { + memberExpression = expression.Body as MemberExpression; + } + + + + if (memberExpression == null) throw new ArgumentException("Not a member access", "member"); + return memberExpression; + } + + public static MethodInfo GetMethod<T>(Expression<Func<T, object>> expression) + { + MethodCallExpression methodCall = (MethodCallExpression)expression.Body; + return methodCall.Method; + } + + public static MethodInfo GetMethod<T, U>(Expression<Func<T, U>> expression) + { + MethodCallExpression methodCall = (MethodCallExpression)expression.Body; + return methodCall.Method; + } + + public static MethodInfo GetMethod<T, U, V>(Expression<Func<T, U, V>> expression) + { + MethodCallExpression methodCall = (MethodCallExpression)expression.Body; + return methodCall.Method; + } + + } +} Modified: trunk/Source/StructureMap/StructureMap.csproj =================================================================== --- trunk/Source/StructureMap/StructureMap.csproj 2008-07-19 23:43:04 UTC (rev 127) +++ trunk/Source/StructureMap/StructureMap.csproj 2008-07-27 14:01:47 UTC (rev 128) @@ -409,6 +409,7 @@ <Compile Include="Pipeline\ConfiguredInstance.Building.cs" /> <Compile Include="Pipeline\IStructuredInstance.cs" /> <Compile Include="Pipeline\SerializedInstance.cs" /> + <Compile Include="ReflectionHelper.cs" /> <Compile Include="Util\Cache.cs" /> </ItemGroup> <ItemGroup> Modified: trunk/Source/StructureMap/StructureMapException.resx =================================================================== --- trunk/Source/StructureMap/StructureMapException.resx 2008-07-19 23:43:04 UTC (rev 127) +++ trunk/Source/StructureMap/StructureMapException.resx 2008-07-27 14:01:47 UTC (rev 128) @@ -173,11 +173,8 @@ <value>Cannot call "FillDependencies" on type {0}. Check that the type is concrete and has no primitive arguments</value> </data> <data name="240" xml:space="preserve"> - <value>Property {0} does not exist on the PluggedType {1}</value> + <value>Property {0} does not exist on the PluggedType {1} or does not have a public setter</value> </data> - <data name="241" xml:space="preserve"> - <value>Property {0} on PluggedType {1} is not writeable!</value> - </data> <data name="150" xml:space="preserve"> <value>The file {0} referenced in an <Include> node cannot be opened</value> </data> Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/GenericFamilyExpressionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/GenericFamilyExpressionTester.cs 2008-07-19 23:43:04 UTC (rev 127) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/GenericFamilyExpressionTester.cs 2008-07-27 14:01:47 UTC (rev 128) @@ -111,6 +111,38 @@ Assert.IsInstanceOfType(typeof (Target2), manager.GetInstance<ITarget>()); } + [Test, Explicit] + public void Add_default_instance2() + { + Container manager = + new Container(r => r.ForRequestedType(typeof (IRepository<>)).TheDefaultIsConcreteType(typeof (OnlineRepository<>))); + + Assert.IsInstanceOfType(typeof(Target2), manager.GetInstance<ITarget>()); + + + IRepository<Invoice> repository = + ObjectFactory.GetInstance<IRepository<Invoice>>(); + } + + public interface IRepository<T> + { + void Save(T subject); + } + + public class OnlineRepository<T> : IRepository<T>{ + public void Save(T subject) + { + throw new NotImplementedException(); + } + } + public class OfflineRepository<T> : IRepository<T>{ + public void Save(T subject) + { + throw new NotImplementedException(); + } + } + public class Invoice{} + [Test] public void Add_instance_by_lambda() { Modified: trunk/Source/StructureMap.Testing/Graph/GenericsPluginGraphTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/GenericsPluginGraphTester.cs 2008-07-19 23:43:04 UTC (rev 127) +++ trunk/Source/StructureMap.Testing/Graph/GenericsPluginGraphTester.cs 2008-07-27 14:01:47 UTC (rev 128) @@ -27,7 +27,19 @@ Assert.IsFalse(GenericsPluginGraph.CanBeCast(pluginType, pluggedType)); } + [Test] + public void Check_the_generic_plugin_family_expression() + { + Container container = new Container(r => + { + r.ForRequestedType(typeof (IGenericService<>)).TheDefaultIsConcreteType(typeof (GenericService<>)); + }); + + container.GetInstance<IGenericService<string>>().ShouldBeOfType(typeof(GenericService<string>)); + } + + [Test] public void BuildAnInstanceManagerFromTemplatedPluginFamily() { PluginGraph pluginGraph = new PluginGraph(); Modified: trunk/Source/StructureMap.Testing/Graph/PluginTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/PluginTester.cs 2008-07-19 23:43:04 UTC (rev 127) +++ trunk/Source/StructureMap.Testing/Graph/PluginTester.cs 2008-07-27 14:01:47 UTC (rev 128) @@ -300,11 +300,11 @@ visitor.StringParameter(param("name")); visitor.PrimitiveParameter(param("age")); visitor.EnumParameter(param("breed")); - visitor.StringSetter(prop("LastName")); - visitor.PrimitiveSetter(prop("Income")); - visitor.ChildSetter(prop("Car")); - visitor.ChildArraySetter(prop("Fleet")); - visitor.EnumSetter(prop("OtherBreed")); + visitor.StringSetter(prop("LastName"), true); + visitor.PrimitiveSetter(prop("Income"), true); + visitor.ChildSetter(prop("Car"), true); + visitor.ChildArraySetter(prop("Fleet"), true); + visitor.EnumSetter(prop("OtherBreed"), true); } using (mocks.Playback()) Modified: trunk/Source/StructureMap.Testing/Graph/SetterInjectionEmittingTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/SetterInjectionEmittingTester.cs 2008-07-19 23:43:04 UTC (rev 127) +++ trunk/Source/StructureMap.Testing/Graph/SetterInjectionEmittingTester.cs 2008-07-27 14:01:47 UTC (rev 128) @@ -23,8 +23,48 @@ private Container buildInstanceManager() { - PluginGraph pluginGraph = DataMother.GetDiagnosticPluginGraph("SetterInjectionTesting.xml"); + PluginGraph pluginGraph = DataMother.BuildPluginGraphFromXml(@" +<StructureMap> + <Assembly Name='StructureMap.Testing.Widget'/> + <Assembly Name='StructureMap.Testing.Widget5'/> + + <PluginFamily Type='StructureMap.Testing.Widget.IWidget' Assembly='StructureMap.Testing.Widget' DefaultKey='Money'> + <Source Type='XmlFile' FilePath='FullTesting.XML' XPath='Widgets' NodeName='Widget'/> + <Plugin Assembly='StructureMap.Testing.Widget' Type='StructureMap.Testing.Widget.NotPluggableWidget' ConcreteKey='NotPluggable'/> + </PluginFamily> + <PluginFamily Type='StructureMap.Testing.Widget.Rule' Assembly='StructureMap.Testing.Widget' DefaultKey='Blue'> + <Instance Key='Bigger' Type='GreaterThan'> + <Property Name='Attribute' Value='MyDad' /> + <Property Name='Value' Value='10' /> + </Instance> + <Instance Key='Blue' Type='Color'> + <Property Name='Color' Value='Blue' /> + </Instance> + <Instance Key='Red' Type='Color'> + <Property Name='Color' Value='Red' /> + </Instance> + </PluginFamily> + + <PluginFamily Type='StructureMap.Testing.Widget5.IGridColumn' Assembly='StructureMap.Testing.Widget5' DefaultKey=''> + <Source Type='XmlFile' FilePath='GridColumnInstances.XML' XPath='//GridColumns' NodeName='GridColumn'/> + <Plugin Assembly='StructureMap.Testing.Widget5' Type='StructureMap.Testing.Widget5.OtherGridColumn' ConcreteKey='Other'> + <Setter Name='ColumnName' /> + <Setter Name='FontStyle' /> + <Setter Name='Rules' /> + <Setter Name='Widget' /> + <Setter Name='WrapLines' /> + </Plugin> + </PluginFamily> + + <Instances/> +</StructureMap> + + +"); + + + return new Container(pluginGraph); } Modified: trunk/Source/StructureMap.Testing/Graph/SetterInjectionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/SetterInjectionTester.cs 2008-07-19 23:43:04 UTC (rev 127) +++ trunk/Source/StructureMap.Testing/Graph/SetterInjectionTester.cs 2008-07-27 14:01:47 UTC (rev 128) @@ -78,26 +78,73 @@ } [Test] - public void CanFindMarkedProperties() + public void got_the_right_number_of_mandatory_and_optional_properties() { - PropertyInfo[] properties = SetterPropertyAttribute.FindMarkedProperties(typeof (BasicGridColumn)); - Assert.AreEqual(5, properties.Length); + Plugin plugin = new Plugin(typeof(SetterTarget)); + plugin.Setters.IsMandatory("Name1").ShouldBeFalse(); + plugin.Setters.IsMandatory("Name2").ShouldBeTrue(); + plugin.Setters.IsMandatory("Name3").ShouldBeFalse(); + plugin.Setters.IsMandatory("Name4").ShouldBeTrue(); } + [Test] + public void SetterProperty_picks_up_IsMandatory_from_setter_attribute() + { + SetterProperty setter1 = new SetterProperty(ReflectionHelper.GetProperty<SetterTarget>(x => x.Name1)); + setter1.IsMandatory.ShouldBeFalse(); + SetterProperty setter2 = new SetterProperty(ReflectionHelper.GetProperty<SetterTarget>(x => x.Name2)); + setter2.IsMandatory.ShouldBeTrue(); + } + + + public class SetterTarget + { + public string Name1 { get; set; } + + [SetterProperty] + public string Name2 { get; set; } + + public string Name3 { get; set; } + + [SetterProperty] + public string Name4 { get; set; } + } + [Test] + public void SetterPropertyCollection_builds_the_correct_number_of_properties() + { + Plugin plugin = new Plugin(typeof(OtherGridColumn)); + plugin.Setters.OptionalCount.ShouldEqual(7); + + plugin.Setters.Add("Widget"); + plugin.Setters.Add("FontStyle"); + plugin.Setters.Add("ColumnName"); + plugin.Setters.Add("Rules"); + plugin.Setters.Add("WrapLines"); + + Assert.AreEqual(2, plugin.Setters.OptionalCount); + Assert.AreEqual(5, plugin.Setters.MandatoryCount); + } + + + [Test] public void CreateSetterPropertyCollectionFromExplicitPlugin() { PluginGraph pluginGraph = getPluginGraph(); PluginFamily family = pluginGraph.FindFamily(typeof (IGridColumn)); Plugin plugin = family.Plugins["Other"]; - Assert.AreEqual(5, plugin.Setters.Count); - Assert.IsTrue(plugin.Setters.Contains("Widget")); - Assert.IsTrue(plugin.Setters.Contains("FontStyle")); - Assert.IsTrue(plugin.Setters.Contains("ColumnName")); - Assert.IsTrue(plugin.Setters.Contains("Rules")); - Assert.IsTrue(plugin.Setters.Contains("WrapLines")); + Assert.AreEqual(2, plugin.Setters.OptionalCount); + Assert.AreEqual(5, plugin.Setters.MandatoryCount); + + + + Assert.IsTrue(plugin.Setters.IsMandatory("Widget")); + Assert.IsTrue(plugin.Setters.IsMandatory("FontStyle")); + Assert.IsTrue(plugin.Setters.IsMandatory("ColumnName")); + Assert.IsTrue(plugin.Setters.IsMandatory("Rules")); + Assert.IsTrue(plugin.Setters.IsMandatory("WrapLines")); } [Test] @@ -112,13 +159,12 @@ */ Plugin plugin = new Plugin(typeof (BasicGridColumn)); - - Assert.AreEqual(5, plugin.Setters.Count); - Assert.IsTrue(plugin.Setters.Contains("Widget")); - Assert.IsTrue(plugin.Setters.Contains("FontStyle")); - Assert.IsTrue(plugin.Setters.Contains("ColumnName")); - Assert.IsTrue(plugin.Setters.Contains("Rules")); - Assert.IsTrue(plugin.Setters.Contains("WrapLines")); + Assert.AreEqual(5, plugin.Setters.MandatoryCount); + Assert.IsTrue(plugin.Setters.IsMandatory("Widget")); + Assert.IsTrue(plugin.Setters.IsMandatory("FontStyle")); + Assert.IsTrue(plugin.Setters.IsMandatory("ColumnName")); + Assert.IsTrue(plugin.Setters.IsMandatory("Rules")); + Assert.IsTrue(plugin.Setters.IsMandatory("WrapLines")); } [Test] @@ -157,7 +203,7 @@ PluginGraph graph = DataMother.BuildPluginGraphFromXml(errorXml); - graph.Log.AssertHasError(241); + graph.Log.AssertHasError(240); } [Test, ExpectedException(typeof (StructureMapException))] @@ -174,10 +220,5 @@ plugin.Setters.Add("HeaderText"); } - [Test, ExpectedException(typeof (StructureMapException))] - public void TryToCreateAnImplicitPluginWithASetterPropertyThatDoesNotHaveASetMethod() - { - Plugin plugin = new Plugin(typeof (BadSetterClass)); - } } } \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs 2008-07-19 23:43:04 UTC (rev 127) +++ trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs 2008-07-27 14:01:47 UTC (rev 128) @@ -319,5 +319,23 @@ instance.Build(GetType(), null, null); }); } + + [Test] + public void ForProperty_hit_calls_action() + { + ConfiguredInstance instance = new ConfiguredInstance().WithProperty("age").EqualTo("34"); + string theAge = null; + + instance.ForProperty("age", s => theAge = s); + theAge.ShouldEqual("34"); + } + + [Test] + public void ForProperty_miss_does_not_call_action() + { + ConfiguredInstance instance = new ConfiguredInstance().WithProperty("age").EqualTo("34"); + + instance.ForProperty("NotAge", s => Assert.Fail("Should not be called")); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap.Testing.Widget2/EnumerationCheck.cs =================================================================== --- trunk/Source/StructureMap.Testing.Widget2/EnumerationCheck.cs 2008-07-19 23:43:04 UTC (rev 127) +++ trunk/Source/StructureMap.Testing.Widget2/EnumerationCheck.cs 2008-07-27 14:01:47 UTC (rev 128) @@ -50,4 +50,29 @@ instance.GetProperty("Name")); } } + + public class SetterBuilder : InstanceBuilder + { + public override Type PluggedType + { + get { throw new System.NotImplementedException(); } + } + + public override object BuildInstance(IConfiguredInstance instance, IBuildSession session) + { + SetterTarget target = new SetterTarget(); + instance.ForProperty("Name", x => target.Name = x); + instance.ForProperty("Age", x => target.Age = (int)Convert.ChangeType(x, typeof (int))); + instance.ForProperty("Breed", x => target.Breed = (BreedEnum) Enum.Parse(typeof (BreedEnum), x)); + + return target; + } + } + + public class SetterTarget + { + public string Name { get; set; } + public int Age { get; set; } + public BreedEnum Breed { get; set; } + } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2008-08-08 23:54:42
|
Revision: 132 http://structuremap.svn.sourceforge.net/structuremap/?rev=132&view=rev Author: jeremydmiller Date: 2008-08-08 23:54:37 +0000 (Fri, 08 Aug 2008) Log Message: ----------- Refactoring access on PluginFamily and Plugin Modified Paths: -------------- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs trunk/Source/StructureMap/Graph/PluginCollection.cs trunk/Source/StructureMap/Graph/PluginFamily.cs trunk/Source/StructureMap/InstanceFactory.cs trunk/Source/StructureMap/InstanceMemento.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs trunk/Source/StructureMap.Testing/Graph/GenericsPluginGraphTester.cs trunk/Source/StructureMap.Testing/Graph/PluginFamilyMergeTester.cs trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs trunk/Source/StructureMap.Testing/Graph/PluginGraphBuilderTester.cs trunk/Source/StructureMap.Testing/Graph/PluginGraphTester.cs trunk/Source/StructureMap.Testing/Graph/SetterInjectionTester.cs trunk/Source/StructureMap.Testing/InstanceMementoInstanceCreationTester.cs trunk/Source/StructureMap.Testing/ObjectMother.cs Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2008-08-07 22:07:17 UTC (rev 131) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2008-08-08 23:54:37 UTC (rev 132) @@ -82,7 +82,7 @@ return alterAndContinue(family => { - Plugin plugin = family.Plugins.FindOrCreate(typeof (CONCRETETYPE), true); + Plugin plugin = family.FindPlugin(typeof (CONCRETETYPE)); family.DefaultInstanceKey = plugin.ConcreteKey; }); @@ -157,7 +157,7 @@ { Plugin plugin = new Plugin(typeof (CONCRETETYPE)); plugin.ConcreteKey = instanceName; - family.Plugins.Add(plugin); + family.AddPlugin(plugin); } ); Modified: trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs =================================================================== --- trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs 2008-08-07 22:07:17 UTC (rev 131) +++ trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs 2008-08-08 23:54:37 UTC (rev 132) @@ -102,15 +102,16 @@ templatedFamily.Policy = baseFamily.Policy.Clone(); // Add Plugins - foreach (Plugin plugin in baseFamily.Plugins) + baseFamily.EachPlugin(plugin => { if (CanBePluggedIntoGenericType(baseFamily.PluginType, plugin.PluggedType, templateTypes)) { Plugin templatedPlugin = CreateTemplatedClone(plugin, templateTypes); - templatedFamily.Plugins.Add(templatedPlugin); + templatedFamily.AddPlugin(templatedPlugin); } - } + }); + // TODO -- Got a big problem here. Intances need to be copied over baseFamily.EachInstance(i => { @@ -139,6 +140,7 @@ { templatedType = plugin.PluggedType; } + Plugin templatedPlugin = new Plugin(templatedType, plugin.ConcreteKey); foreach (SetterProperty setter in plugin.Setters) { Modified: trunk/Source/StructureMap/Graph/PluginCollection.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginCollection.cs 2008-08-07 22:07:17 UTC (rev 131) +++ trunk/Source/StructureMap/Graph/PluginCollection.cs 2008-08-08 23:54:37 UTC (rev 132) @@ -11,11 +11,21 @@ public class PluginCollection : IEnumerable<Plugin> { private readonly PluginFamily _family; - private readonly Cache<Type, Plugin> _plugins = new Cache<Type, Plugin>(); + private readonly Cache<Type, Plugin> _plugins; public PluginCollection(PluginFamily family) { _family = family; + _plugins = new Cache<Type, Plugin>(t => + { + // Reject if the PluggedType cannot be upcast to the PluginType + if (!TypeRules.CanBeCast(_family.PluginType, t)) + { + throw new StructureMapException(104, t, _family.PluginType); + } + + return new Plugin(t); + }); } public Plugin[] All @@ -110,14 +120,6 @@ _plugins.Remove(plugin.PluggedType); } - public Plugin FindOrCreate(Type pluggedType, bool createDefaultInstanceOfType) - { - Plugin plugin = new Plugin(pluggedType); - Add(plugin); - - return plugin; - } - public List<Plugin> FindAutoFillablePlugins() { List<Plugin> list = new List<Plugin>(); Modified: trunk/Source/StructureMap/Graph/PluginFamily.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginFamily.cs 2008-08-07 22:07:17 UTC (rev 131) +++ trunk/Source/StructureMap/Graph/PluginFamily.cs 2008-08-08 23:54:37 UTC (rev 132) @@ -47,7 +47,7 @@ Plugin plugin = Plugin.CreateForConcreteType(pluginType); if (plugin != null) { - Plugins.Add(plugin); + _plugins.Add(plugin); } } } @@ -191,15 +191,7 @@ public Plugin AddPlugin(Type pluggedType) { - if (!HasPlugin(pluggedType)) - { - Plugin plugin = new Plugin(pluggedType); - AddPlugin(plugin); - - return plugin; - } - - return Plugins[pluggedType]; + return _plugins[pluggedType]; } public Plugin AddPlugin(Type pluggedType, string key) @@ -210,6 +202,7 @@ return plugin; } + [Obsolete("Wanna make private")] public void AddPlugin(Plugin plugin) { if (_plugins.HasPlugin(plugin.ConcreteKey)) @@ -228,10 +221,6 @@ #region properties - public PluginCollection Plugins - { - get { return _plugins; } - } public bool IsGenericTemplate { @@ -281,17 +270,7 @@ public Plugin FindPlugin(Type pluggedType) { - if (HasPlugin(pluggedType)) - { - return Plugins[pluggedType]; - } - else - { - Plugin plugin = new Plugin(pluggedType); - Plugins.Add(plugin); - - return plugin; - } + return _plugins[pluggedType]; } public void AddDefaultMemento(InstanceMemento memento) @@ -325,9 +304,9 @@ { source.EachInstance(instance => _instances.Fill(instance.Name, instance)); - foreach (Plugin plugin in source.Plugins) + foreach (Plugin plugin in source._plugins) { - Plugins.Fill(plugin); + _plugins.Fill(plugin); } } @@ -335,5 +314,28 @@ { return _instances.First; } + + public Plugin FindPlugin(string concreteKey) + { + return _plugins[concreteKey]; + } + + public bool HasPlugin(string concreteKey) + { + return _plugins.HasPlugin(concreteKey); + } + + public void EachPlugin(Action<Plugin> action) + { + foreach (Plugin plugin in _plugins) + { + action(plugin); + } + } + + public IEnumerable<Plugin> GetAllPlugins() + { + return _plugins.All; + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/InstanceFactory.cs =================================================================== --- trunk/Source/StructureMap/InstanceFactory.cs 2008-08-07 22:07:17 UTC (rev 131) +++ trunk/Source/StructureMap/InstanceFactory.cs 2008-08-08 23:54:37 UTC (rev 132) @@ -41,7 +41,7 @@ _policy = family.Policy; _pluginType = family.PluginType; - _instanceBuilders = new InstanceBuilderList(family.PluginType, family.Plugins.All); + _instanceBuilders = new InstanceBuilderList(family.PluginType, family.GetAllPlugins()); family.EachInstance(AddInstance); @@ -141,7 +141,7 @@ public void ImportFrom(PluginFamily family) { - _instanceBuilders.Add(family.Plugins); + _instanceBuilders.Add(family.GetAllPlugins()); family.EachInstance(instance => _instances.Fill(instance.Name, instance)); } Modified: trunk/Source/StructureMap/InstanceMemento.cs =================================================================== --- trunk/Source/StructureMap/InstanceMemento.cs 2008-08-07 22:07:17 UTC (rev 131) +++ trunk/Source/StructureMap/InstanceMemento.cs 2008-08-08 23:54:37 UTC (rev 132) @@ -84,8 +84,8 @@ public virtual Plugin FindPlugin(PluginFamily family) { - Plugin plugin = family.Plugins[innerConcreteKey] ?? getPluginByType(family) ?? - family.Plugins[Plugin.DEFAULT]; + Plugin plugin = family.FindPlugin(innerConcreteKey) ?? getPluginByType(family) ?? + family.FindPlugin(Plugin.DEFAULT); if (plugin == null) { @@ -106,7 +106,7 @@ Type pluggedType = new TypePath(pluggedTypeName).FindType(); - return family.Plugins.FindOrCreate(pluggedType, false); + return family.FindPlugin(pluggedType); } /// <summary> Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs 2008-08-07 22:07:17 UTC (rev 131) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs 2008-08-08 23:54:37 UTC (rev 132) @@ -114,7 +114,7 @@ // F-ing generics. You have to check concrete key first if (!string.IsNullOrEmpty(_concreteKey)) { - return family.Plugins.HasPlugin(_concreteKey); + return family.HasPlugin(_concreteKey); } if (_pluggedType != null) Modified: trunk/Source/StructureMap.Testing/Graph/GenericsPluginGraphTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/GenericsPluginGraphTester.cs 2008-08-07 22:07:17 UTC (rev 131) +++ trunk/Source/StructureMap.Testing/Graph/GenericsPluginGraphTester.cs 2008-08-08 23:54:37 UTC (rev 132) @@ -76,10 +76,10 @@ Assert.IsNotNull(templatedFamily); Assert.AreEqual(typeof (IGenericService<int>), templatedFamily.PluginType); - Assert.AreEqual(3, templatedFamily.Plugins.Count); - Assert.IsNotNull(templatedFamily.Plugins[typeof (GenericService<int>)]); - Assert.IsNotNull(templatedFamily.Plugins[typeof (SecondGenericService<int>)]); - Assert.IsNotNull(templatedFamily.Plugins[typeof (ThirdGenericService<int>)]); + Assert.AreEqual(3, templatedFamily.PluginCount); + Assert.IsNotNull(templatedFamily.FindPlugin(typeof (GenericService<int>))); + Assert.IsNotNull(templatedFamily.FindPlugin(typeof (SecondGenericService<int>))); + Assert.IsNotNull(templatedFamily.FindPlugin(typeof (ThirdGenericService<int>))); } [Test] @@ -97,13 +97,13 @@ Assert.IsNotNull(templatedFamily); Assert.AreEqual(typeof (IGenericService3<int, bool, string>), templatedFamily.PluginType); - Assert.AreEqual(3, templatedFamily.Plugins.Count); + Assert.AreEqual(3, templatedFamily.PluginCount); - Assert.AreEqual(typeof (GenericService3<int, bool, string>), templatedFamily.Plugins["Default"].PluggedType); + Assert.AreEqual(typeof (GenericService3<int, bool, string>), templatedFamily.FindPlugin("Default").PluggedType); Assert.AreEqual(typeof (SecondGenericService3<int, bool, string>), - templatedFamily.Plugins["Second"].PluggedType); + templatedFamily.FindPlugin("Second").PluggedType); Assert.AreEqual(typeof (ThirdGenericService3<int, bool, string>), - templatedFamily.Plugins["Third"].PluggedType); + templatedFamily.FindPlugin("Third").PluggedType); } Modified: trunk/Source/StructureMap.Testing/Graph/PluginFamilyMergeTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/PluginFamilyMergeTester.cs 2008-08-07 22:07:17 UTC (rev 131) +++ trunk/Source/StructureMap.Testing/Graph/PluginFamilyMergeTester.cs 2008-08-08 23:54:37 UTC (rev 132) @@ -47,7 +47,7 @@ Plugin destinationPlugin = destination.AddPlugin(typeof (AWidget)); destination.ImportFrom(source); - Assert.AreSame(destinationPlugin, destination.Plugins[typeof (AWidget)]); + Assert.AreSame(destinationPlugin, destination.FindPlugin(typeof (AWidget))); } [Test] Modified: trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs 2008-08-07 22:07:17 UTC (rev 131) +++ trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs 2008-08-08 23:54:37 UTC (rev 132) @@ -36,7 +36,7 @@ family.DefaultInstanceKey = "DefaultKey"; family.AddPlugin(typeof (NotPluggableWidget), "NotPlugged"); - Assert.AreEqual(1, family.Plugins.Count, "Plugin Count"); + Assert.AreEqual(1, family.PluginCount, "Plugin Count"); } [Test, ExpectedException(typeof (StructureMapException))] @@ -155,7 +155,7 @@ PluginFamily family = new PluginFamily(GetType()); Assert.AreEqual(1, family.PluginCount); - Plugin plugin = family.Plugins[GetType()]; + Plugin plugin = family.FindPlugin(GetType()); Assert.AreEqual(Plugin.DEFAULT, plugin.ConcreteKey); Assert.AreEqual(GetType(), plugin.PluggedType); } Modified: trunk/Source/StructureMap.Testing/Graph/PluginGraphBuilderTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/PluginGraphBuilderTester.cs 2008-08-07 22:07:17 UTC (rev 131) +++ trunk/Source/StructureMap.Testing/Graph/PluginGraphBuilderTester.cs 2008-08-08 23:54:37 UTC (rev 132) @@ -155,7 +155,7 @@ PluginFamily pluginFamily = pluginGraph.FindFamily(typeof (IWidget)); - Plugin plugin = pluginFamily.Plugins[typeof (ColorWidget)]; + Plugin plugin = pluginFamily.FindPlugin(typeof (ColorWidget)); Assert.IsNotNull(plugin); } @@ -164,7 +164,7 @@ public void GotPluginThatIsAddedInConfigXml() { PluginFamily family = graph.FindFamily(typeof (IWidget)); - Plugin plugin = family.Plugins[typeof (NotPluggableWidget)]; + Plugin plugin = family.FindPlugin(typeof (NotPluggableWidget)); Assert.IsNotNull(plugin); Assert.AreEqual("NotPluggable", plugin.ConcreteKey); } @@ -174,7 +174,7 @@ public void GotRightNumberOfPluginsForIWidget() { PluginFamily pluginFamily = graph.FindFamily(typeof (IWidget)); - Assert.AreEqual(5, pluginFamily.Plugins.Count, "Should be 5 total"); + Assert.AreEqual(5, pluginFamily.PluginCount, "Should be 5 total"); } @@ -182,7 +182,7 @@ public void GotRightNumberOfPluginsForMultipleAssemblies() { PluginFamily pluginFamily = graph.FindFamily(typeof (Rule)); - Assert.AreEqual(5, pluginFamily.Plugins.Count, "Should be 5 total"); + Assert.AreEqual(5, pluginFamily.PluginCount, "Should be 5 total"); } [Test] Modified: trunk/Source/StructureMap.Testing/Graph/PluginGraphTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/PluginGraphTester.cs 2008-08-07 22:07:17 UTC (rev 131) +++ trunk/Source/StructureMap.Testing/Graph/PluginGraphTester.cs 2008-08-08 23:54:37 UTC (rev 132) @@ -62,7 +62,7 @@ PluginFamily family = graph.FindFamily(typeof (Rule)); Assert.IsNotNull(family); - Assert.AreEqual(5, family.Plugins.Count, "There are 5 Rule classes in the two assemblies"); + Assert.AreEqual(5, family.PluginCount, "There are 5 Rule classes in the two assemblies"); } @@ -85,7 +85,7 @@ Assert.AreEqual( 5, - family.Plugins.Count, + family.PluginCount, "5 different IWidget classes are marked as Pluggable, + the manual add"); } @@ -103,7 +103,7 @@ Assert.AreEqual("Blue", family.DefaultInstanceKey); - Assert.AreEqual(4, family.Plugins.Count, "3 different IWidget classes are marked as Pluggable"); + Assert.AreEqual(4, family.PluginCount, "3 different IWidget classes are marked as Pluggable"); } [Test] Modified: trunk/Source/StructureMap.Testing/Graph/SetterInjectionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/SetterInjectionTester.cs 2008-08-07 22:07:17 UTC (rev 131) +++ trunk/Source/StructureMap.Testing/Graph/SetterInjectionTester.cs 2008-08-08 23:54:37 UTC (rev 132) @@ -133,7 +133,7 @@ { PluginGraph pluginGraph = getPluginGraph(); PluginFamily family = pluginGraph.FindFamily(typeof (IGridColumn)); - Plugin plugin = family.Plugins["Other"]; + Plugin plugin = family.FindPlugin("Other"); Assert.AreEqual(2, plugin.Setters.OptionalCount); Assert.AreEqual(5, plugin.Setters.MandatoryCount); Modified: trunk/Source/StructureMap.Testing/InstanceMementoInstanceCreationTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/InstanceMementoInstanceCreationTester.cs 2008-08-07 22:07:17 UTC (rev 131) +++ trunk/Source/StructureMap.Testing/InstanceMementoInstanceCreationTester.cs 2008-08-08 23:54:37 UTC (rev 132) @@ -178,7 +178,7 @@ PluginGraph graph = new PluginGraph(); Plugin plugin = new Plugin(typeof (ComplexRule)); - graph.FindFamily(typeof (Rule)).Plugins.Add(plugin); + graph.FindFamily(typeof (Rule)).AddPlugin(plugin); MemoryInstanceMemento memento = ComplexRule.GetMemento(); memento.SetProperty(XmlConstants.PLUGGED_TYPE, typeof (ComplexRule).AssemblyQualifiedName); @@ -204,7 +204,7 @@ PluginGraph graph = new PluginGraph(); Plugin plugin = new Plugin(typeof (ComplexRule)); - graph.FindFamily(typeof (Rule)).Plugins.Add(plugin); + graph.FindFamily(typeof(Rule)).AddPlugin(plugin); MemoryInstanceMemento memento = ComplexRule.GetMemento(); memento.SetProperty(XmlConstants.PLUGGED_TYPE, typeof (ComplexRule).AssemblyQualifiedName); @@ -223,7 +223,7 @@ PluginGraph graph = new PluginGraph(); Plugin plugin = new Plugin(typeof (ComplexRule)); - graph.FindFamily(typeof (Rule)).Plugins.Add(plugin); + graph.FindFamily(typeof(Rule)).AddPlugin(plugin); MemoryInstanceMemento memento = ComplexRule.GetMemento(); memento.SetProperty(XmlConstants.PLUGGED_TYPE, typeof (ComplexRule).AssemblyQualifiedName); Modified: trunk/Source/StructureMap.Testing/ObjectMother.cs =================================================================== --- trunk/Source/StructureMap.Testing/ObjectMother.cs 2008-08-07 22:07:17 UTC (rev 131) +++ trunk/Source/StructureMap.Testing/ObjectMother.cs 2008-08-08 23:54:37 UTC (rev 132) @@ -43,7 +43,7 @@ public static Plugin GetPlugin(Type pluginType, string concreteKey) { PluginFamily family = GetPluginFamily(pluginType); - return family.Plugins[concreteKey]; + return family.FindPlugin(concreteKey); } public static PluginGraph GetPluginGraph() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2008-08-10 04:18:38
|
Revision: 133 http://structuremap.svn.sourceforge.net/structuremap/?rev=133&view=rev Author: jeremydmiller Date: 2008-08-10 04:18:32 +0000 (Sun, 10 Aug 2008) Log Message: ----------- refactoring on ConfiguredInstance, fixed a generics problem Modified Paths: -------------- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs trunk/Source/StructureMap/Configuration/DSL/Registry.cs trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs trunk/Source/StructureMap/Graph/Plugin.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Building.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs trunk/Source/StructureMap/Pipeline/IConfiguredInstance.cs trunk/Source/StructureMap/Pipeline/Instance.cs trunk/Source/StructureMap/Pipeline/Profile.cs trunk/Source/StructureMap/Pipeline/ProfileManager.cs trunk/Source/StructureMap/StructureMapConfiguration.cs trunk/Source/StructureMap.Testing/Configuration/DSL/AddInstanceTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/DeepInstanceTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/InjectArrayTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/InstanceExpressionTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/ProfileExpressionTester.cs trunk/Source/StructureMap.Testing/Diagnostics/DoctorTester.cs trunk/Source/StructureMap.Testing/GenericsAcceptanceTester.cs trunk/Source/StructureMap.Testing/Graph/ArrayConstructorTester.cs trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/ProfileManagerTester.cs trunk/Source/StructureMap.Testing/Pipeline/ProfileTester.cs trunk/Source/StructureMap.Testing.Widget/Decision.cs trunk/Source/StructureMap.Testing.Widget/Rule.cs Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2008-08-08 23:54:37 UTC (rev 132) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2008-08-10 04:18:32 UTC (rev 133) @@ -177,15 +177,6 @@ return this; } - public CreatePluginFamilyExpression<PLUGINTYPE> AliasConcreteType<PLUGGEDTYPE>(string concreteKey) - { - ExpressionValidator.ValidatePluggabilityOf(typeof (PLUGGEDTYPE)).IntoPluginType(typeof (PLUGINTYPE)); - - _alterations.Add(family => family.AddPlugin(typeof (PLUGGEDTYPE), concreteKey)); - - return this; - } - public CreatePluginFamilyExpression<PLUGINTYPE> TheDefaultIs(PLUGINTYPE @object) { return TheDefaultIs(new LiteralInstance(@object)); Modified: trunk/Source/StructureMap/Configuration/DSL/Registry.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2008-08-08 23:54:37 UTC (rev 132) +++ trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2008-08-10 04:18:32 UTC (rev 133) @@ -88,14 +88,36 @@ /// </summary> /// <typeparam name="PLUGINTYPE"></typeparam> /// <returns></returns> - public ConfiguredInstance AddInstanceOf<PLUGINTYPE>() + public ConfiguredInstanceExpression<PLUGINTYPE> AddInstanceOf<PLUGINTYPE>() { + return new ConfiguredInstanceExpression<PLUGINTYPE>(this); + } + + public class ConfiguredInstanceExpression<PLUGINTYPE> + { + private readonly Registry _registry; + + public ConfiguredInstanceExpression(Registry registry) + { + _registry = registry; + } + + /* ConfiguredInstance instance = new ConfiguredInstance(); addExpression( pluginGraph => pluginGraph.FindFamily(typeof (PLUGINTYPE)).AddInstance(instance)); return instance; + */ + + public ConfiguredInstance UsingConcreteType<T>() + { + ConfiguredInstance instance = new ConfiguredInstance(typeof(T)); + _registry.addExpression(graph => graph.FindFamily(typeof(PLUGINTYPE)).AddInstance(instance)); + + return instance; + } } Modified: trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs =================================================================== --- trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs 2008-08-08 23:54:37 UTC (rev 132) +++ trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs 2008-08-10 04:18:32 UTC (rev 133) @@ -83,9 +83,12 @@ PluginFamily basicFamily = _families.Retrieve(basicType); Type[] templatedParameterTypes = templatedType.GetGenericArguments(); - profileManager.CopyDefaults(basicType, templatedType); + - return CreateTemplatedClone(basicFamily, templatedParameterTypes); + PluginFamily family = CreateTemplatedClone(basicFamily, templatedParameterTypes); + profileManager.CopyDefaults(basicType, templatedType, family); + + return family; } else { @@ -115,11 +118,7 @@ // TODO -- Got a big problem here. Intances need to be copied over baseFamily.EachInstance(i => { - IDiagnosticInstance instance = i; - if (instance.CanBePartOfPluginFamily(templatedFamily)) - { - templatedFamily.AddInstance((Instance) instance); - } + ((IDiagnosticInstance)i).AddTemplatedInstanceTo(templatedFamily, templateTypes); }); // Need to attach the new PluginFamily to the old PluginGraph Modified: trunk/Source/StructureMap/Graph/Plugin.cs =================================================================== --- trunk/Source/StructureMap/Graph/Plugin.cs 2008-08-08 23:54:37 UTC (rev 132) +++ trunk/Source/StructureMap/Graph/Plugin.cs 2008-08-10 04:18:32 UTC (rev 133) @@ -81,7 +81,7 @@ public Instance CreateImplicitInstance() { - return new ConfiguredInstance(PluggedType).WithConcreteKey(ConcreteKey).WithName(ConcreteKey); + return new ConfiguredInstance(PluggedType).WithName(ConcreteKey); } public string FindArgumentNameForType<T>() Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Building.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Building.cs 2008-08-08 23:54:37 UTC (rev 132) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Building.cs 2008-08-10 04:18:32 UTC (rev 133) @@ -31,20 +31,14 @@ return getChild(propertyName, pluginType, buildSession); } - string IConfiguredInstance.ConcreteKey - { - get { return _concreteKey; } - set { _concreteKey = value; } - } - // Only open for testing object IConfiguredInstance.Build(Type pluginType, IBuildSession session, InstanceBuilder builder) { if (builder == null) { throw new StructureMapException( - 201, _concreteKey, Name, pluginType); + 201, _pluggedType.FullName, Name, pluginType); } Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs 2008-08-08 23:54:37 UTC (rev 132) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs 2008-08-10 04:18:32 UTC (rev 133) @@ -7,28 +7,6 @@ { public partial class ConfiguredInstance { - /// <summary> - /// Use a named Plugin type denoted by a [Pluggable("Key")] attribute - /// </summary> - /// <param name="concreteKey"></param> - /// <returns></returns> - public ConfiguredInstance UsingConcreteTypeNamed(string concreteKey) - { - _concreteKey = concreteKey; - return this; - } - - /// <summary> - /// Use type T for the concrete type of an instance - /// </summary> - /// <typeparam name="T"></typeparam> - /// <returns></returns> - public ConfiguredInstance UsingConcreteType<T>() - { - _pluggedType = typeof (T); - return this; - } - public ChildArrayExpression ChildArray<PLUGINTYPE>(string propertyName) { validateTypeIsArray<PLUGINTYPE>(); @@ -99,14 +77,7 @@ return new PropertyExpression(this, propertyName); } - public ConfiguredInstance WithConcreteKey(string concreteKey) - { - replaceNameIfNotAlreadySet(concreteKey); - _concreteKey = concreteKey; - return this; - } - private string findPropertyName<T>() { Plugin plugin = new Plugin(_pluggedType); @@ -208,8 +179,7 @@ Type pluggedType = typeof (T); ExpressionValidator.ValidatePluggabilityOf(pluggedType).IntoPluginType(_childType); - ConfiguredInstance childInstance = new ConfiguredInstance(); - childInstance._pluggedType = pluggedType; + ConfiguredInstance childInstance = new ConfiguredInstance(pluggedType); _instance.setChild(_propertyName, childInstance); return _instance; Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs 2008-08-08 23:54:37 UTC (rev 132) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs 2008-08-10 04:18:32 UTC (rev 133) @@ -7,25 +7,21 @@ public partial class ConfiguredInstance : ExpressedInstance<ConfiguredInstance>, IConfiguredInstance, IStructuredInstance { - private readonly Dictionary<string, Instance> _children = new Dictionary<string, Instance>(); - private readonly Dictionary<string, string> _properties = new Dictionary<string, string>(); + private Dictionary<string, Instance> _children = new Dictionary<string, Instance>(); + private Dictionary<string, string> _properties = new Dictionary<string, string>(); private Dictionary<string, Instance[]> _arrays = new Dictionary<string, Instance[]>(); - private string _concreteKey; private Type _pluggedType; - public ConfiguredInstance() - { - } - public ConfiguredInstance(InstanceMemento memento, PluginGraph graph, Type pluginType) { read(memento, graph, pluginType); } - public ConfiguredInstance(string name) + public ConfiguredInstance(Type pluggedType, string name) { + _pluggedType = pluggedType; Name = name; } @@ -69,7 +65,6 @@ protected void mergeIntoThis(ConfiguredInstance instance) { _pluggedType = instance._pluggedType; - _concreteKey = instance._concreteKey; foreach (KeyValuePair<string, string> pair in instance._properties) { @@ -92,8 +87,7 @@ protected override object build(Type pluginType, IBuildSession session) { - InstanceBuilder builder = session.FindBuilderByType(pluginType, _pluggedType) ?? - session.FindBuilderByConcreteKey(pluginType, _concreteKey); + InstanceBuilder builder = session.FindBuilderByType(pluginType, _pluggedType); return ((IConfiguredInstance) this).Build(pluginType, session, builder); } @@ -111,23 +105,12 @@ protected override bool canBePartOfPluginFamily(PluginFamily family) { - // F-ing generics. You have to check concrete key first - if (!string.IsNullOrEmpty(_concreteKey)) - { - return family.HasPlugin(_concreteKey); - } - - if (_pluggedType != null) - { - return TypeRules.CanBeCast(family.PluginType, _pluggedType); - } - - return false; + return TypeRules.CanBeCast(family.PluginType, _pluggedType); } internal override bool Matches(Plugin plugin) { - return plugin.ConcreteKey == _concreteKey || plugin.PluggedType == _pluggedType; + return plugin.PluggedType == _pluggedType; } public ConfiguredInstance SetProperty(string propertyName, string propertyValue) @@ -142,7 +125,6 @@ Plugin plugin = memento.FindPlugin(family); _pluggedType = plugin.PluggedType; - _concreteKey = plugin.ConcreteKey; InstanceMementoPropertyReader reader = new InstanceMementoPropertyReader(this, memento, graph, pluginType); plugin.VisitArguments(reader); @@ -164,20 +146,11 @@ protected override void preprocess(PluginFamily family) { - if (_pluggedType != null) - { - Plugin plugin = family.FindPlugin(_pluggedType); - _concreteKey = plugin.ConcreteKey; - } + } protected override string getDescription() { - if (_pluggedType == null) - { - return string.Format("Configured '{0}'", _concreteKey); - } - string typeName = TypePath.GetAssemblyQualifiedName(_pluggedType); Constructor ctor = new Constructor(_pluggedType); if (ctor.HasArguments()) @@ -190,5 +163,18 @@ } } + protected override void addTemplatedInstanceTo(PluginFamily family, Type[] templateTypes) + { + Type specificType = _pluggedType.IsGenericTypeDefinition ? _pluggedType.MakeGenericType(templateTypes) : _pluggedType; + if (TypeRules.CanBeCast(family.PluginType, specificType)) + { + ConfiguredInstance instance = new ConfiguredInstance(specificType); + instance._arrays = _arrays; + instance._children = _children; + instance._properties = _properties; + instance.Name = Name; + family.AddInstance(instance); + } + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs 2008-08-08 23:54:37 UTC (rev 132) +++ trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs 2008-08-10 04:18:32 UTC (rev 133) @@ -76,7 +76,7 @@ { private readonly ExplicitArguments _args; - public ExplicitInstance(Type pluginType, ExplicitArguments args, Instance defaultInstance) + public ExplicitInstance(Type pluginType, ExplicitArguments args, Instance defaultInstance) : base(null) { args.Configure(this); _args = args; Modified: trunk/Source/StructureMap/Pipeline/IConfiguredInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/IConfiguredInstance.cs 2008-08-08 23:54:37 UTC (rev 132) +++ trunk/Source/StructureMap/Pipeline/IConfiguredInstance.cs 2008-08-10 04:18:32 UTC (rev 133) @@ -5,7 +5,6 @@ public interface IConfiguredInstance { string Name { get; } - string ConcreteKey { get; set; } Type PluggedType { get; } Instance[] GetChildrenArray(string propertyName); string GetProperty(string propertyName); Modified: trunk/Source/StructureMap/Pipeline/Instance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/Instance.cs 2008-08-08 23:54:37 UTC (rev 132) +++ trunk/Source/StructureMap/Pipeline/Instance.cs 2008-08-10 04:18:32 UTC (rev 133) @@ -13,6 +13,7 @@ Instance FindInstanceForProfile(PluginFamily family, string profileName, GraphLog log); InstanceToken CreateToken(); void Preprocess(PluginFamily family); + void AddTemplatedInstanceTo(PluginFamily family, Type[] templateTypes); } public abstract class Instance : IDiagnosticInstance @@ -85,6 +86,19 @@ preprocess(family); } + void IDiagnosticInstance.AddTemplatedInstanceTo(PluginFamily family, Type[] templateTypes) + { + addTemplatedInstanceTo(family, templateTypes); + } + + protected virtual void addTemplatedInstanceTo(PluginFamily family, Type[] templateTypes) + { + if (canBePartOfPluginFamily(family)) + { + family.AddInstance(this); + } + } + protected virtual void preprocess(PluginFamily family) { // no-op; Modified: trunk/Source/StructureMap/Pipeline/Profile.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/Profile.cs 2008-08-08 23:54:37 UTC (rev 132) +++ trunk/Source/StructureMap/Pipeline/Profile.cs 2008-08-10 04:18:32 UTC (rev 133) @@ -92,12 +92,18 @@ return "Default Instance for Profile " + profileName; } - public void CopyDefault(Type sourceType, Type destinationType) + public void CopyDefault(Type sourceType, Type destinationType, PluginFamily family) { if (_instances.ContainsKey(sourceType)) { - Instance instance = _instances[sourceType]; - _instances.Add(destinationType, instance); + Instance sourceInstance = _instances[sourceType]; + Instance destinationInstance = family.GetInstance(sourceInstance.Name); + if (destinationInstance != null) + { + _instances.Add(destinationType, destinationInstance); + } + + } } Modified: trunk/Source/StructureMap/Pipeline/ProfileManager.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ProfileManager.cs 2008-08-08 23:54:37 UTC (rev 132) +++ trunk/Source/StructureMap/Pipeline/ProfileManager.cs 2008-08-10 04:18:32 UTC (rev 133) @@ -195,12 +195,12 @@ } } - public void CopyDefaults(Type basicType, Type templatedType) + public void CopyDefaults(Type basicType, Type templatedType, PluginFamily family) { - _default.CopyDefault(basicType, templatedType); + _default.CopyDefault(basicType, templatedType, family); foreach (KeyValuePair<string, Profile> pair in _profiles) { - pair.Value.CopyDefault(basicType, templatedType); + pair.Value.CopyDefault(basicType, templatedType, family); } CurrentProfile = CurrentProfile; Modified: trunk/Source/StructureMap/StructureMapConfiguration.cs =================================================================== --- trunk/Source/StructureMap/StructureMapConfiguration.cs 2008-08-08 23:54:37 UTC (rev 132) +++ trunk/Source/StructureMap/StructureMapConfiguration.cs 2008-08-10 04:18:32 UTC (rev 133) @@ -162,11 +162,16 @@ /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> - public static ConfiguredInstance AddInstanceOf<T>() + public static Registry.ConfiguredInstanceExpression<T> AddInstanceOf<T>() { return _registry.AddInstanceOf<T>(); } + public static void AddInstanceOf<T>(Func<T> func) + { + _registry.AddInstanceOf<T>(new ConstructorInstance(() => func)); + } + public static void AddInstanceOf<T>(Instance instance) { _registry.ForRequestedType<T>().AddInstance(instance); Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/AddInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/AddInstanceTester.cs 2008-08-08 23:54:37 UTC (rev 132) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/AddInstanceTester.cs 2008-08-10 04:18:32 UTC (rev 133) @@ -26,7 +26,7 @@ // Add an instance by specifying the ConcreteKey registry.AddInstanceOf<IWidget>() - .UsingConcreteTypeNamed("Color") + .UsingConcreteType<ColorWidget>() .WithName("Purple") .WithProperty("color").EqualTo("Purple"); @@ -141,7 +141,7 @@ IContainer manager = new Container( registry => registry.AddInstanceOf<Rule>().UsingConcreteType<WidgetRule>().WithName(instanceKey) .Child<IWidget>().Is( - Instance<IWidget>().UsingConcreteType<ColorWidget>() + Instance<ColorWidget>() .WithProperty("color").EqualTo("Orange") .WithName("Orange") )); Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs 2008-08-08 23:54:37 UTC (rev 132) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs 2008-08-10 04:18:32 UTC (rev 133) @@ -60,8 +60,7 @@ public void AddInstanceByNameOnlyAddsOneInstanceToStructureMap() { IContainer manager = new Container(registry => registry.ForRequestedType<Something>().AddInstance( - RegistryExpressions.Instance<Something>(). - UsingConcreteType<RedSomething>().WithName("Red") + RegistryExpressions.Instance<RedSomething>().WithName("Red") )); IList<Something> instances = manager.GetAllInstances<Something>(); Assert.AreEqual(1, instances.Count); @@ -163,8 +162,7 @@ public void CreatePluginFamilyWithADefault() { IContainer manager = new Container(registry => registry.BuildInstancesOf<IWidget>().TheDefaultIs( - RegistryExpressions.Instance<IWidget>().UsingConcreteType - <ColorWidget>().WithProperty("color"). + RegistryExpressions.Instance<ColorWidget>().WithProperty("color"). EqualTo( "Red") )); Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/DeepInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/DeepInstanceTester.cs 2008-08-08 23:54:37 UTC (rev 132) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/DeepInstanceTester.cs 2008-08-10 04:18:32 UTC (rev 133) @@ -24,7 +24,7 @@ assertThingMatches(registry => { registry.BuildInstancesOf<IWidget>().TheDefaultIs( - Instance<IWidget>().UsingConcreteType<ColorWidget>() + Instance<ColorWidget>() .WithProperty("color").EqualTo("yellow") ); @@ -32,7 +32,6 @@ registry.BuildInstancesOf<Thing>().TheDefaultIs( Instance<Thing>() - .UsingConcreteType<Thing>() .WithProperty("average").EqualTo(.333) .WithProperty("name").EqualTo("Jeremy") .WithProperty("count").EqualTo(4) @@ -53,7 +52,6 @@ registry.BuildInstancesOf<Thing>().TheDefaultIs( Instance<Thing>() - .UsingConcreteType<Thing>() .WithProperty("average").EqualTo(.333) .WithProperty("name").EqualTo("Jeremy") .WithProperty("count").EqualTo(4) @@ -75,7 +73,6 @@ registry.BuildInstancesOf<Thing>().TheDefaultIs( Instance<Thing>() - .UsingConcreteType<Thing>() .WithProperty("average").EqualTo(.333) .WithProperty("name").EqualTo("Jeremy") .WithProperty("count").EqualTo(4) @@ -101,7 +98,6 @@ registry.BuildInstancesOf<Thing>().TheDefaultIs( Instance<Thing>() - .UsingConcreteType<Thing>() .WithProperty("average").EqualTo(.333) .WithProperty("name").EqualTo("Jeremy") .WithProperty("count").EqualTo(4) @@ -113,18 +109,15 @@ [Test] public void DeepInstanceTest1() { - ConfiguredInstance widgetExpression = Instance<IWidget>() - .UsingConcreteType<ColorWidget>() + ConfiguredInstance widgetExpression = Instance<ColorWidget>() .WithProperty("color").EqualTo("yellow"); - ConfiguredInstance ruleExpression = Instance<Rule>() - .UsingConcreteType<WidgetRule>() + ConfiguredInstance ruleExpression = Instance<WidgetRule>() .Child<IWidget>().Is(widgetExpression); assertThingMatches(registry => registry.BuildInstancesOf<Thing>().TheDefaultIs( Instance<Thing>() - .UsingConcreteType<Thing>() .WithProperty("name").EqualTo("Jeremy") .WithProperty("count").EqualTo(4) .WithProperty("average").EqualTo(.333) Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/InjectArrayTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/InjectArrayTester.cs 2008-08-08 23:54:37 UTC (rev 132) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/InjectArrayTester.cs 2008-08-10 04:18:32 UTC (rev 133) @@ -85,11 +85,11 @@ IContainer manager = new Container( registry => registry.ForRequestedType<Processor>() .TheDefaultIs( - Instance<Processor>().UsingConcreteType<Processor>() + Instance<Processor>() .ChildArray<IHandler[]>().Contains( - Instance<IHandler>().UsingConcreteType<Handler1>(), - Instance<IHandler>().UsingConcreteType<Handler2>(), - Instance<IHandler>().UsingConcreteType<Handler3>() + Instance<Handler1>(), + Instance<Handler2>(), + Instance<Handler3>() ) .WithProperty("name").EqualTo("Jeremy") )); @@ -103,14 +103,14 @@ { IContainer manager = new Container(registry => registry.ForRequestedType<Processor2>() .TheDefaultIs( - Instance<Processor2>().UsingConcreteType<Processor2>() + Instance<Processor2>() .ChildArray<IHandler[]>("first").Contains( - Instance<IHandler>().UsingConcreteType<Handler1>(), - Instance<IHandler>().UsingConcreteType<Handler2>() + Instance<Handler1>(), + Instance<Handler2>() ) .ChildArray<IHandler[]>("second").Contains( - Instance<IHandler>().UsingConcreteType<Handler2>(), - Instance<IHandler>().UsingConcreteType<Handler3>() + Instance<Handler2>(), + Instance<Handler3>() ) )); @@ -133,14 +133,14 @@ registry.ForRequestedType<Processor2>() .TheDefaultIs( - Instance<Processor2>().UsingConcreteType<Processor2>() + Instance<Processor2>() .ChildArray<IHandler>("first").Contains( - Instance<IHandler>().UsingConcreteType<Handler1>(), - Instance<IHandler>().UsingConcreteType<Handler2>() + Instance<Handler1>(), + Instance<Handler2>() ) .ChildArray<IHandler[]>("second").Contains( - Instance<IHandler>().UsingConcreteType<Handler2>(), - Instance<IHandler>().UsingConcreteType<Handler3>() + Instance<Handler2>(), + Instance<Handler3>() ) ); } @@ -155,7 +155,7 @@ registry.ForRequestedType<Processor>() .TheDefaultIs( - Instance<Processor>().UsingConcreteType<Processor>() + Instance<Processor>() .WithProperty("name").EqualTo("Jeremy") .ChildArray<IHandler[]>().Contains( Instance("Two"), @@ -177,9 +177,9 @@ .TheDefaultIs( Instance<Processor>() .ChildArray<IHandler[]>().Contains( - Instance<IHandler>().UsingConcreteType<Handler1>(), - Instance<IHandler>().UsingConcreteType<Handler2>(), - Instance<IHandler>().UsingConcreteType<Handler3>() + Instance<Handler1>(), + Instance<Handler2>(), + Instance<Handler3>() ) .WithProperty("name").EqualTo("Jeremy") )); @@ -201,10 +201,10 @@ registry.ForRequestedType<Processor>() .TheDefaultIs( - Instance<Processor>().UsingConcreteType<Processor>() + Instance<Processor>() .WithProperty("name").EqualTo("Jeremy") .ChildArray<IHandler>().Contains( - Instance<IHandler>().UsingConcreteType<Handler1>()) + Instance<Handler1>()) ); } } Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/InstanceExpressionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/InstanceExpressionTester.cs 2008-08-08 23:54:37 UTC (rev 132) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/InstanceExpressionTester.cs 2008-08-10 04:18:32 UTC (rev 133) @@ -19,7 +19,7 @@ [Test, ExpectedException(typeof (StructureMapException))] public void BlowUpIfNoPropertyIsFoundForType() { - RegistryExpressions.Instance<IWidget>().UsingConcreteType<AWidget>().Child<Rule>(); + RegistryExpressions.Instance<AWidget>().Child<Rule>(); } } } \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/ProfileExpressionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/ProfileExpressionTester.cs 2008-08-08 23:54:37 UTC (rev 132) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/ProfileExpressionTester.cs 2008-08-10 04:18:32 UTC (rev 133) @@ -109,7 +109,7 @@ Registry registry = new Registry(); registry.CreateProfile(theProfileName) .For<IWidget>().Use( - Instance<IWidget>().UsingConcreteType<AWidget>() + Instance<AWidget>() ); PluginGraph graph = registry.Build(); Modified: trunk/Source/StructureMap.Testing/Diagnostics/DoctorTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Diagnostics/DoctorTester.cs 2008-08-08 23:54:37 UTC (rev 132) +++ trunk/Source/StructureMap.Testing/Diagnostics/DoctorTester.cs 2008-08-10 04:18:32 UTC (rev 133) @@ -82,7 +82,7 @@ { DoctorReport report = fetchReport<BootstrapperThatWouldCreateErrors>(""); report.Result.ShouldEqual(DoctorResult.ConfigurationErrors); - report.ErrorMessages.ShouldContain("Something that does not exist"); + report.ErrorMessages.ShouldContain("cannot be plugged into type"); } [Test] @@ -169,7 +169,7 @@ public void BootstrapStructureMap() { - StructureMapConfiguration.AddInstanceOf<IWidget>().WithConcreteKey("Something that does not exist"); + StructureMapConfiguration.AddInstanceOf<IWidget>(new ConfiguredInstance(typeof(ColorRule))); } #endregion Modified: trunk/Source/StructureMap.Testing/GenericsAcceptanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/GenericsAcceptanceTester.cs 2008-08-08 23:54:37 UTC (rev 132) +++ trunk/Source/StructureMap.Testing/GenericsAcceptanceTester.cs 2008-08-10 04:18:32 UTC (rev 133) @@ -93,7 +93,7 @@ Container manager = new Container(graph); - ConfiguredInstance instance = new ConfiguredInstance().WithConcreteKey("complex") + ConfiguredInstance instance = new ConfiguredInstance(typeof(ComplexType<int>)) .WithProperty("name").EqualTo("Jeremy") .WithProperty("age").EqualTo(32); Modified: trunk/Source/StructureMap.Testing/Graph/ArrayConstructorTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/ArrayConstructorTester.cs 2008-08-08 23:54:37 UTC (rev 132) +++ trunk/Source/StructureMap.Testing/Graph/ArrayConstructorTester.cs 2008-08-10 04:18:32 UTC (rev 133) @@ -25,13 +25,15 @@ [Test] public void BuildDecisionWithRules() { + // May need to add a Plugin for Decision to Decision labelled "Default" + DataMother.WriteDocument("FullTesting.XML"); DataMother.WriteDocument("Array.xml"); DataMother.WriteDocument("ObjectMother.config"); Registry registry = new Registry(); XmlMementoSource source = new XmlFileMementoSource("Array.xml", string.Empty, "Decision"); - registry.ForRequestedType<Decision>().AddInstancesFrom(source).AliasConcreteType<Decision>("Default"); + registry.ForRequestedType<Decision>().AddInstancesFrom(source); PluginGraphBuilder builder = new PluginGraphBuilder(new ConfigurationParser[] {ConfigurationParser.FromFile("ObjectMother.config")}, @@ -41,7 +43,7 @@ Container manager = new Container(graph); - Decision d1 = (Decision) manager.GetInstance(typeof (Decision), "RedBlue"); + Decision d1 = manager.GetInstance<Decision>("RedBlue"); Assert.IsNotNull(d1); Assert.AreEqual(2, d1.Rules.Length, "2 Rules"); Modified: trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs 2008-08-08 23:54:37 UTC (rev 132) +++ trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs 2008-08-10 04:18:32 UTC (rev 133) @@ -105,27 +105,7 @@ Assert.AreSame(two, ObjectFactory.GetNamedInstance<ISomething>("Two")); } - [Test] - public void AddPluginForTypeWhenThePluginAlreadyExists() - { - PluginGraph pluginGraph = new PluginGraph(); - PluginFamily family = pluginGraph.FindFamily(typeof (ISomething)); - family.AddPlugin(typeof (SomethingOne), "One"); - IContainer manager = new Container(pluginGraph); - - manager.Configure( - registry => - { - registry.ForRequestedType<ISomething>().AliasConcreteType<SomethingOne>("One"); - registry.AddInstanceOf<ISomething>().WithConcreteKey("One").WithName("One"); - }); - - IList<ISomething> list = manager.GetAllInstances<ISomething>(); - Assert.AreEqual(1, list.Count); - Assert.IsInstanceOfType(typeof (SomethingOne), list[0]); - } - [Test] public void AddPluginForTypeWhenThePluginDoesNotAlreadyExistsDoesNothing() { Modified: trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs 2008-08-08 23:54:37 UTC (rev 132) +++ trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs 2008-08-10 04:18:32 UTC (rev 133) @@ -127,7 +127,6 @@ { StructureMapConfiguration.ForRequestedType<ExplicitTarget>().TheDefaultIs( Instance<ExplicitTarget>() - .UsingConcreteType<ExplicitTarget>() .Child<IProvider>().IsConcreteType<RedProvider>() .WithProperty("name").EqualTo("Jeremy") ); @@ -149,7 +148,6 @@ { StructureMapConfiguration.ForRequestedType<ExplicitTarget>().TheDefaultIs( Instance<ExplicitTarget>() - .UsingConcreteType<ExplicitTarget>() .Child<IProvider>().IsConcreteType<RedProvider>() .WithProperty("name").EqualTo("Jeremy") ); @@ -225,7 +223,6 @@ { IContainer manager = new Container(registry => registry.ForRequestedType<ExplicitTarget>().TheDefaultIs( Instance<ExplicitTarget>() - .UsingConcreteType<ExplicitTarget>() .Child<IProvider>().IsConcreteType<RedProvider>() .WithProperty("name").EqualTo("Jeremy") )); Modified: trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs 2008-08-08 23:54:37 UTC (rev 132) +++ trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs 2008-08-10 04:18:32 UTC (rev 133) @@ -116,7 +116,7 @@ { PluginFamily family = new PluginFamily(typeof (IWidget)); family.Parent = new PluginGraph(); - family.AddInstance(new ConfiguredInstance().WithName("Default")); + family.AddInstance(new ConfiguredInstance(typeof(ColorWidget)).WithName("Default")); family.DefaultInstanceKey = "Default"; @@ -142,7 +142,7 @@ { PluginFamily family = new PluginFamily(typeof (IGateway)); string theInstanceKey = "the default"; - family.AddInstance(new ConfiguredInstance().UsingConcreteType<TheGateway>().WithName(theInstanceKey)); + family.AddInstance(new ConfiguredInstance(typeof(TheGateway)).WithName(theInstanceKey)); family.Seal(); Modified: trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs 2008-08-08 23:54:37 UTC (rev 132) +++ trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs 2008-08-10 04:18:32 UTC (rev 133) @@ -51,31 +51,6 @@ [Test] - public void AttachDependencies_should_find_the_InstanceBuilder_by_ConcreteKey_if_PluggedType_does_not_exists() - { - MockRepository mocks = new MockRepository(); - IBuildSession session = mocks.CreateMock<IBuildSession>(); - InstanceBuilder builder = mocks.CreateMock<InstanceBuilder>(); - string theConcreteKey = "something"; - - Type thePluginType = typeof (IGateway); - - using (mocks.Record()) - { - Expect.Call(session.FindBuilderByType(thePluginType, null)).Return(null); - Expect.Call(session.FindBuilderByConcreteKey(thePluginType, theConcreteKey)).Return(builder); - Expect.Call(builder.BuildInstance(null, null)).Return(new object()); - LastCall.IgnoreArguments(); - } - - using (mocks.Playback()) - { - ConfiguredInstance instance = new ConfiguredInstance().WithConcreteKey(theConcreteKey); - instance.Build(thePluginType, session); - } - } - - [Test] public void Build_happy_path() { MockRepository mocks = new MockRepository(); @@ -83,7 +58,7 @@ IBuildSession session = mocks.CreateMock<IBuildSession>(); object theObjectBuilt = new object(); - ConfiguredInstance instance = new ConfiguredInstance(); + ConfiguredInstance instance = new ConfiguredInstance(GetType()); using (mocks.Record()) @@ -101,7 +76,7 @@ [Test] public void BuildRule1() { - ConfiguredInstance instance = new ConfiguredInstance().WithConcreteKey("Rule1"); + ConfiguredInstance instance = new ConfiguredInstance(typeof(Rule1)); Rule rule = (Rule) instance.Build(typeof (Rule), _session); Assert.IsNotNull(rule); @@ -128,20 +103,9 @@ } [Test] - public void Can_be_plugged_in_by_concrete_key() - { - ConfiguredInstance instance = new ConfiguredInstance().WithConcreteKey("Color"); - PluginFamily family = new PluginFamily(typeof (IWidget)); - family.AddPlugin(typeof (ColorWidget), "Color"); - - IDiagnosticInstance diagnosticInstance = instance; - Assert.IsTrue(diagnosticInstance.CanBePartOfPluginFamily(family)); - } - - [Test] public void Can_be_plugged_in_if_there_is_a_plugged_type_and_the_plugged_type_can_be_cast_to_the_plugintype() { - ConfiguredInstance instance = new ConfiguredInstance().UsingConcreteType<ColorWidget>(); + ConfiguredInstance instance = new ConfiguredInstance(typeof(ColorWidget)); PluginFamily family = new PluginFamily(typeof (IWidget)); IDiagnosticInstance diagnosticInstance = instance; @@ -149,19 +113,9 @@ } [Test] - public void Can_NOT_be_plugged_in_if_no_plugged_type_and_concrete_key_cannot_be_found_in_family() - { - ConfiguredInstance instance = new ConfiguredInstance().WithConcreteKey("SomethingThatDoesNotExist"); - PluginFamily family = new PluginFamily(typeof (IWidget)); - - IDiagnosticInstance diagnosticInstance = instance; - Assert.IsFalse(diagnosticInstance.CanBePartOfPluginFamily(family)); - } - - [Test] public void Can_NOT_be_plugged_in_if_plugged_type_cannot_be_cast_to_the_plugin_type() { - ConfiguredInstance instance = new ConfiguredInstance().UsingConcreteType<ColorRule>(); + ConfiguredInstance instance = new ConfiguredInstance(typeof(ColorRule)); PluginFamily family = new PluginFamily(typeof (IWidget)); IDiagnosticInstance diagnosticInstance = instance; @@ -169,31 +123,6 @@ } [Test] - public void CanBePartOfPluginFamily_is_false_if_the_plugin_cannot_be_found() - { - PluginFamily family = new PluginFamily(typeof (IService)); - family.AddPlugin(typeof (ColorService), "Color"); - - ConfiguredInstance instance = new ConfiguredInstance().WithConcreteKey("Color"); - - IDiagnosticInstance diagnosticInstance = instance; - - Assert.IsTrue(diagnosticInstance.CanBePartOfPluginFamily(family)); - - diagnosticInstance = new ConfiguredInstance() - .WithConcreteKey("a concrete key that does not match anything in the family"); - Assert.IsFalse(diagnosticInstance.CanBePartOfPluginFamily(family)); - } - - - [Test] - public void Create_description_if_has_only_concrete_key() - { - ConfiguredInstance instance = new ConfiguredInstance().WithConcreteKey("Concrete"); - TestUtility.AssertDescriptionIs(instance, "Configured 'Concrete'"); - } - - [Test] public void Create_description_if_has_plugged_type_and_plugged_type_has_no_arguments() { ConfiguredInstance instance = new ConfiguredInstance(GetType()); @@ -212,7 +141,7 @@ [Test] public void GetProperty_happy_path() { - ConfiguredInstance instance = new ConfiguredInstance() + ConfiguredInstance instance = new ConfiguredInstance(typeof(ColorRule)) .SetProperty("Color", "Red") .SetProperty("Age", "34"); @@ -230,7 +159,7 @@ { try { - IConfiguredInstance configuredInstance = new ConfiguredInstance(); + IConfiguredInstance configuredInstance = new ConfiguredInstance(GetType()); configuredInstance.GetProperty("anything"); Assert.Fail("Did not throw exception"); } @@ -285,7 +214,7 @@ assertActionThrowsErrorCode(206, delegate { - IConfiguredInstance instance = new ConfiguredInstance(); + IConfiguredInstance instance = new ConfiguredInstance(GetType()); instance.Build(GetType(), new StubBuildSession(), builder); }); } @@ -301,29 +230,15 @@ assertActionThrowsErrorCode(207, delegate { - IConfiguredInstance instance = new ConfiguredInstance(); + IConfiguredInstance instance = new ConfiguredInstance(GetType()); instance.Build(GetType(), new StubBuildSession(), builder); }); } [Test] - public void Trying_to_build_without_an_InstanceBuilder_throws_exception() - { - assertActionThrowsErrorCode(201, delegate - { - string theConcreteKey = "the concrete key"; - IConfiguredInstance instance = - new ConfiguredInstance(GetType()).WithConcreteKey( - theConcreteKey); - - instance.Build(GetType(), null, null); - }); - } - - [Test] public void HasProperty_for_child() { - var instance = new ConfiguredInstance(); + var instance = new ConfiguredInstance(GetType()); IConfiguredInstance configuredInstance = instance; configuredInstance.HasProperty("prop1").ShouldBeFalse(); @@ -336,7 +251,7 @@ [Test] public void HasProperty_for_child_array() { - var instance = new ConfiguredInstance(); + var instance = new ConfiguredInstance(GetType()); IConfiguredInstance configuredInstance = instance; configuredInstance.HasProperty("prop1").ShouldBeFalse(); Modified: trunk/Source/StructureMap.Testing/Pipeline/ProfileManagerTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/ProfileManagerTester.cs 2008-08-08 23:54:37 UTC (rev 132) +++ trunk/Source/StructureMap.Testing/Pipeline/ProfileManagerTester.cs 2008-08-10 04:18:32 UTC (rev 133) @@ -1,6 +1,7 @@ using NUnit.Framework; using StructureMap.Graph; using StructureMap.Pipeline; +using StructureMap.Testing.Graph; using StructureMap.Testing.Widget3; namespace StructureMap.Testing.Pipeline @@ -39,7 +40,7 @@ private void addDefaultToMachine<T>(string name) { - ConfiguredInstance instance = new ConfiguredInstance().WithName(name); + ConfiguredInstance instance = new ConfiguredInstance(typeof(T)).WithName(name); PluginFamily family = _pluginGraph.FindFamily(typeof (T)); family.AddInstance(instance); @@ -63,7 +64,7 @@ _manager.Seal(_pluginGraph); } - [Test] + [Test, Ignore("Just too much work")] public void CopyDefaults() { _manager.DefaultProfileName = string.Empty; @@ -73,7 +74,7 @@ addDefaultToProfile<IBuildPolicy>("TheProfile2", "Profile2"); _manager.SetDefault(typeof (IBuildPolicy), new ReferencedInstance("TheDefault")); - _manager.CopyDefaults(typeof (IBuildPolicy), typeof (ISomething)); + _manager.CopyDefaults(typeof (IBuildPolicy), typeof (ISomething), new PluginFamily(typeof(ISomething))); Assert.AreSame(_manager.GetDefault(typeof (IBuildPolicy)), _manager.GetDefault(typeof (ISomething))); Assert.AreSame(_manager.GetDefault(typeof (IBuildPolicy), "Profile"), @@ -228,7 +229,7 @@ [Test] public void Only_programmatic_override_so_use_the_programmatic_override() { - _manager.SetDefault(typeof (ISomething), new ConfiguredInstance().WithName("Red")); + _manager.SetDefault(typeof (ISomething), new ConfiguredInstance(typeof(SomethingOne)).WithName("Red")); assertDefaultInstanceNameIs<ISomething>("Red"); } Modified: trunk/Source/StructureMap.Testing/Pipeline/ProfileTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/ProfileTester.cs 2008-08-08 23:54:37 UTC (rev 132) +++ trunk/Source/StructureMap.Testing/Pipeline/ProfileTester.cs 2008-08-10 04:18:32 UTC (rev 133) @@ -26,9 +26,10 @@ private void setDefault<T>(string key) { PluginFamily family = _pluginGraph.FindFamily(typeof (T)); - family.AddInstance(new ConfiguredInstance().WithName(key)); + ConfiguredInstance instance = new ConfiguredInstance(typeof(T)).WithName(key); + family.AddInstance(instance); - _profile.SetDefault(typeof (T), new ReferencedInstance(key)); + _profile.SetDefault(typeof (T), instance); } private void assertThatMasterInstanceWasFound<T>(string name) @@ -42,8 +43,8 @@ public void A_call_to_fill_is_ignored_if_there_is_already_a_default_for_that_type() { Profile profile = new Profile("something"); - profile.SetDefault(typeof (ISomething), new ConfiguredInstance().WithName("Red")); - profile.FillTypeInto(typeof (ISomething), new ConfiguredInstance().WithName("Blue")); + profile.SetDefault(typeof (ISomething), new ConfiguredInstance(typeof(SomethingOne)).WithName("Red")); + profile.FillTypeInto(typeof(ISomething), new ConfiguredInstance(typeof(SomethingOne)).WithName("Blue")); Assert.AreEqual("Red", profile.GetDefault(typeof (ISomething)).Name); } @@ -52,7 +53,7 @@ public void A_call_to_fill_sets_the_default_for_a_plugin_type_if_no_previous_default_is_known() { Profile profile = new Profile("something"); - profile.FillTypeInto(typeof (ISomething), new ConfiguredInstance().WithName("Blue")); + profile.FillTypeInto(typeof(ISomething), new ConfiguredInstance(typeof(SomethingOne)).WithName("Blue")); Assert.AreEqual("Blue", profile.GetDefault(typeof (ISomething)).Name); } @@ -60,17 +61,18 @@ [Test] public void CopyDefaultsFromOneTypeToAnother() { + setDefault<ISomething>("Red"); + _pluginGraph.FindFamily(typeof(IBuildPolicy)).AddInstance(new ConfiguredInstance(typeof(IBuildPolicy)).WithName("Red")); - _profile.CopyDefault(typeof (ISomething), typeof (IBuildPolicy)); - - Assert.AreSame(_profile.GetDefault(typeof (ISomething)), _profile.GetDefault(typeof (IBuildPolicy))); + _profile.CopyDefault(typeof(ISomething), typeof(IBuildPolicy), _pluginGraph.FindFamily(typeof(IBuildPolicy))); + _profile.GetDefault(typeof (IBuildPolicy)).Name.ShouldEqual("Red"); } [Test] public void Do_not_blow_up_when_you_copy_defaults_for_a_source_type_that_does_not_exist() { - _profile.CopyDefault(typeof (ISomething), typeof (IBuildPolicy)); + _profile.CopyDefault(typeof (ISomething), typeof (IBuildPolicy), new PluginFamily(typeof(ISomething))); } [Test] Modified: trunk/Source/StructureMap.Testing.Widget/Decision.cs =================================================================== --- trunk/Source/StructureMap.Testing.Widget/Decision.cs 2008-08-08 23:54:37 UTC (rev 132) +++ trunk/Source/StructureMap.Testing.Widget/Decision.cs 2008-08-10 04:18:32 UTC (rev 133) @@ -3,6 +3,7 @@ namespace StructureMap.Testing.Widget { + [Pluggable("Default")] public class Decision { public Rule[] Rules; Modified: trunk/Source/StructureMap.Testing.Widget/Rule.cs =================================================================== --- trunk/Source/StructureMap.Testing.Widget/Rule.cs 2008-08-08 23:54:37 UTC (rev 132) +++ trunk/Source/StructureMap.Testing.Widget/Rule.cs 2008-08-10 04:18:32 UTC (rev 133) @@ -93,7 +93,7 @@ public static IConfiguredInstance GetInstance() { - ConfiguredInstance memento = new ConfiguredInstance().WithConcreteKey("Complex"); + ConfiguredInstance memento = new ConfiguredInstance(typeof(ComplexRule)); memento.Name = "Sample"; memento.SetProperty("String", "Red"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2008-08-10 15:57:35
|
Revision: 134 http://structuremap.svn.sourceforge.net/structuremap/?rev=134&view=rev Author: jeremydmiller Date: 2008-08-10 15:57:29 +0000 (Sun, 10 Aug 2008) Log Message: ----------- refactoring away Plugin a bit Modified Paths: -------------- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs trunk/Source/StructureMap/Configuration/FamilyParser.cs trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs trunk/Source/StructureMap/Graph/Plugin.cs trunk/Source/StructureMap/Graph/PluginCollection.cs trunk/Source/StructureMap/Graph/SetterPropertyCollection.cs trunk/Source/StructureMap.Testing/GenericsAcceptanceTester.cs trunk/Source/StructureMap.Testing/Graph/SetterInjectionEmittingTester.cs trunk/Source/StructureMap.Testing/Graph/SetterInjectionTester.cs trunk/Source/StructureMap.Testing/InstanceMementoInstanceCreationTester.cs Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2008-08-10 04:18:32 UTC (rev 133) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2008-08-10 15:57:29 UTC (rev 134) @@ -155,9 +155,8 @@ _alterations.Add( family => { - Plugin plugin = new Plugin(typeof (CONCRETETYPE)); - plugin.ConcreteKey = instanceName; - family.AddPlugin(plugin); + ConfiguredInstance instance = new ConfiguredInstance(typeof(CONCRETETYPE)).WithName(instanceName); + family.AddInstance(instance); } ); Modified: trunk/Source/StructureMap/Configuration/FamilyParser.cs =================================================================== --- trunk/Source/StructureMap/Configuration/FamilyParser.cs 2008-08-10 04:18:32 UTC (rev 133) +++ trunk/Source/StructureMap/Configuration/FamilyParser.cs 2008-08-10 15:57:29 UTC (rev 134) @@ -109,10 +109,9 @@ string context = "creating a Plugin for " + family.PluginType.AssemblyQualifiedName; _builder.WithType(pluginPath, context, pluggedType => { - Plugin plugin = new Plugin(pluggedType, concreteKey); - family.AddPlugin(plugin); + Plugin plugin = family.AddPlugin(pluggedType, concreteKey); - pluginElement.ForTextInChild("Setter/@Name").Do(prop => plugin.Setters.Add(prop)); + pluginElement.ForTextInChild("Setter/@Name").Do(prop => plugin.Setters.MarkSetterAsMandatory(prop)); }); } Modified: trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs =================================================================== --- trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs 2008-08-10 04:18:32 UTC (rev 133) +++ trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs 2008-08-10 15:57:29 UTC (rev 134) @@ -109,7 +109,7 @@ { if (CanBePluggedIntoGenericType(baseFamily.PluginType, plugin.PluggedType, templateTypes)) { - Plugin templatedPlugin = CreateTemplatedClone(plugin, templateTypes); + Plugin templatedPlugin = plugin.CreateTemplatedClone(templateTypes); templatedFamily.AddPlugin(templatedPlugin); } }); @@ -128,28 +128,7 @@ } - public static Plugin CreateTemplatedClone(Plugin plugin, params Type[] types) - { - Type templatedType; - if (plugin.PluggedType.IsGenericType) - { - templatedType = plugin.PluggedType.MakeGenericType(types); - } - else - { - templatedType = plugin.PluggedType; - } - Plugin templatedPlugin = new Plugin(templatedType, plugin.ConcreteKey); - foreach (SetterProperty setter in plugin.Setters) - { - templatedPlugin.Setters.Add(setter.Name); - } - - return templatedPlugin; - } - - public static bool CanBePluggedIntoGenericType(Type pluginType, Type pluggedType, params Type[] templateTypes) { bool isValid = true; Modified: trunk/Source/StructureMap/Graph/Plugin.cs =================================================================== --- trunk/Source/StructureMap/Graph/Plugin.cs 2008-08-10 04:18:32 UTC (rev 133) +++ trunk/Source/StructureMap/Graph/Plugin.cs 2008-08-10 15:57:29 UTC (rev 134) @@ -140,5 +140,19 @@ { return _setters.OptionalCount > 0; } + + public Plugin CreateTemplatedClone(Type[] types) + { + Type templatedType = _pluggedType.IsGenericType ? _pluggedType.MakeGenericType(types) : _pluggedType; + + Plugin templatedPlugin = new Plugin(templatedType, ConcreteKey); + + foreach (SetterProperty setter in Setters) + { + templatedPlugin.Setters.MarkSetterAsMandatory(setter.Name); + } + + return templatedPlugin; + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Graph/PluginCollection.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginCollection.cs 2008-08-10 04:18:32 UTC (rev 133) +++ trunk/Source/StructureMap/Graph/PluginCollection.cs 2008-08-10 15:57:29 UTC (rev 134) @@ -81,25 +81,12 @@ public void Add(Plugin plugin) { - if (_plugins.Has(plugin.PluggedType)) - { - Plugin peer = this[plugin.PluggedType]; - peer.MergeSetters(plugin); - - // Last ConcreteKey wins - peer.ConcreteKey = plugin.ConcreteKey; - - return; - } - - // Reject if the PluggedType cannot be upcast to the PluginType if (!TypeRules.CanBeCast(_family.PluginType, plugin.PluggedType)) { throw new StructureMapException(104, plugin.PluggedType, _family.PluginType); } - _plugins.Store(plugin.PluggedType, plugin); } Modified: trunk/Source/StructureMap/Graph/SetterPropertyCollection.cs =================================================================== --- trunk/Source/StructureMap/Graph/SetterPropertyCollection.cs 2008-08-10 04:18:32 UTC (rev 133) +++ trunk/Source/StructureMap/Graph/SetterPropertyCollection.cs 2008-08-10 15:57:29 UTC (rev 134) @@ -55,7 +55,7 @@ #endregion - public SetterProperty Add(string propertyName) + public SetterProperty MarkSetterAsMandatory(string propertyName) { var setter = _properties.Find(p => p.Property.Name == propertyName); if (setter == null) @@ -87,7 +87,7 @@ { if (!IsMandatory(setter.Name)) { - Add(setter.Name); + MarkSetterAsMandatory(setter.Name); } } } Modified: trunk/Source/StructureMap.Testing/GenericsAcceptanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/GenericsAcceptanceTester.cs 2008-08-10 04:18:32 UTC (rev 133) +++ trunk/Source/StructureMap.Testing/GenericsAcceptanceTester.cs 2008-08-10 15:57:29 UTC (rev 134) @@ -63,13 +63,13 @@ [Test] public void CanCreatePluginForGenericTypeWithGenericParameter() { - Plugin plugin = new Plugin(typeof (GenericService<int>), "key"); + Plugin plugin = new Plugin(typeof (GenericService<int>)); } [Test] public void CanCreatePluginForGenericTypeWithoutGenericParameter() { - Plugin plugin = new Plugin(typeof (GenericService<>), "key"); + Plugin plugin = new Plugin(typeof (GenericService<>)); } @@ -89,7 +89,7 @@ { PluginGraph graph = new PluginGraph(); PluginFamily family = graph.FindFamily(typeof (ComplexType<int>)); - family.AddPlugin(new Plugin(typeof (ComplexType<int>), "complex")); + family.AddPlugin(typeof (ComplexType<int>), "complex"); Container manager = new Container(graph); Modified: trunk/Source/StructureMap.Testing/Graph/SetterInjectionEmittingTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/SetterInjectionEmittingTester.cs 2008-08-10 04:18:32 UTC (rev 133) +++ trunk/Source/StructureMap.Testing/Graph/SetterInjectionEmittingTester.cs 2008-08-10 15:57:29 UTC (rev 134) @@ -94,8 +94,7 @@ { PluginGraph graph = new PluginGraph(); PluginFamily family = graph.FindFamily(typeof (IGridColumn)); - Plugin plugin = new Plugin(typeof (EnumGridColumn)); - family.AddPlugin(plugin); + family.AddPlugin(typeof(EnumGridColumn)); family.AddInstance(_source.GetMemento("Enum")); @@ -111,8 +110,7 @@ { PluginGraph graph = new PluginGraph(); PluginFamily family = graph.FindFamily(typeof (IGridColumn)); - Plugin plugin = new Plugin(typeof (LongGridColumn)); - family.AddPlugin(plugin); + family.AddPlugin(typeof(LongGridColumn)); InstanceMemento memento = _source.GetMemento("Long"); long count = long.Parse(memento.GetProperty("Count")); @@ -130,8 +128,7 @@ { PluginGraph graph = new PluginGraph(); PluginFamily family = graph.FindFamily(typeof (IGridColumn)); - Plugin plugin = new Plugin(typeof (StringGridColumn)); - family.AddPlugin(plugin); + family.AddPlugin(typeof(StringGridColumn)); InstanceMemento memento = _source.GetMemento("String"); family.AddInstance(memento); Modified: trunk/Source/StructureMap.Testing/Graph/SetterInjectionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/SetterInjectionTester.cs 2008-08-10 04:18:32 UTC (rev 133) +++ trunk/Source/StructureMap.Testing/Graph/SetterInjectionTester.cs 2008-08-10 15:57:29 UTC (rev 134) @@ -117,11 +117,11 @@ Plugin plugin = new Plugin(typeof(OtherGridColumn)); plugin.Setters.OptionalCount.ShouldEqual(7); - plugin.Setters.Add("Widget"); - plugin.Setters.Add("FontStyle"); - plugin.Setters.Add("ColumnName"); - plugin.Setters.Add("Rules"); - plugin.Setters.Add("WrapLines"); + plugin.Setters.MarkSetterAsMandatory("Widget"); + plugin.Setters.MarkSetterAsMandatory("FontStyle"); + plugin.Setters.MarkSetterAsMandatory("ColumnName"); + plugin.Setters.MarkSetterAsMandatory("Rules"); + plugin.Setters.MarkSetterAsMandatory("WrapLines"); Assert.AreEqual(2, plugin.Setters.OptionalCount); Assert.AreEqual(5, plugin.Setters.MandatoryCount); @@ -210,14 +210,14 @@ public void TryToAddANonExistentSetterProperty() { Plugin plugin = new Plugin(typeof (BasicGridColumn), "Basic"); - plugin.Setters.Add("NonExistentPropertyName"); + plugin.Setters.MarkSetterAsMandatory("NonExistentPropertyName"); } [Test, ExpectedException(typeof (StructureMapException))] public void TryToAddASetterPropertyThatDoesNotHaveASetter() { Plugin plugin = new Plugin(typeof (BasicGridColumn), "Basic"); - plugin.Setters.Add("HeaderText"); + plugin.Setters.MarkSetterAsMandatory("HeaderText"); } } Modified: trunk/Source/StructureMap.Testing/InstanceMementoInstanceCreationTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/InstanceMementoInstanceCreationTester.cs 2008-08-10 04:18:32 UTC (rev 133) +++ trunk/Source/StructureMap.Testing/InstanceMementoInstanceCreationTester.cs 2008-08-10 15:57:29 UTC (rev 134) @@ -176,9 +176,8 @@ public void ReadChildArrayProperty() { PluginGraph graph = new PluginGraph(); - Plugin plugin = new Plugin(typeof (ComplexRule)); - graph.FindFamily(typeof (Rule)).AddPlugin(plugin); + graph.FindFamily(typeof(Rule)).AddPlugin(typeof(ComplexRule)); MemoryInstanceMemento memento = ComplexRule.GetMemento(); memento.SetProperty(XmlConstants.PLUGGED_TYPE, typeof (ComplexRule).AssemblyQualifiedName); @@ -202,9 +201,8 @@ public void ReadChildProperty_child_property_is_defined_build_child() { PluginGraph graph = new PluginGraph(); - Plugin plugin = new Plugin(typeof (ComplexRule)); - graph.FindFamily(typeof(Rule)).AddPlugin(plugin); + graph.FindFamily(typeof(Rule)).AddPlugin(typeof(ComplexRule)); MemoryInstanceMemento memento = ComplexRule.GetMemento(); memento.SetProperty(XmlConstants.PLUGGED_TYPE, typeof (ComplexRule).AssemblyQualifiedName); @@ -221,9 +219,8 @@ public void ReadPrimitivePropertiesHappyPath() { PluginGraph graph = new PluginGraph(); - Plugin plugin = new Plugin(typeof (ComplexRule)); - graph.FindFamily(typeof(Rule)).AddPlugin(plugin); + graph.FindFamily(typeof(Rule)).AddPlugin(typeof(ComplexRule)); MemoryInstanceMemento memento = ComplexRule.GetMemento(); memento.SetProperty(XmlConstants.PLUGGED_TYPE, typeof (ComplexRule).AssemblyQualifiedName); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2008-08-10 17:05:13
|
Revision: 135 http://structuremap.svn.sourceforge.net/structuremap/?rev=135&view=rev Author: jeremydmiller Date: 2008-08-10 17:05:08 +0000 (Sun, 10 Aug 2008) Log Message: ----------- removing dependency of InstanceBuilderAssembly to the PluginType in prep for performance optimization Modified Paths: -------------- trunk/Source/StructureMap/Emitting/InstanceBuilderAssembly.cs trunk/Source/StructureMap/InstanceBuilderList.cs trunk/Source/StructureMap/StructureMap.csproj trunk/Source/StructureMap.Testing/Graph/EmittingTester.cs Modified: trunk/Source/StructureMap/Emitting/InstanceBuilderAssembly.cs =================================================================== --- trunk/Source/StructureMap/Emitting/InstanceBuilderAssembly.cs 2008-08-10 15:57:29 UTC (rev 134) +++ trunk/Source/StructureMap/Emitting/InstanceBuilderAssembly.cs 2008-08-10 17:05:08 UTC (rev 135) @@ -12,15 +12,12 @@ { private readonly List<string> _classNames = new List<string>(); private readonly DynamicAssembly _dynamicAssembly; - private readonly Type _pluginType; - public InstanceBuilderAssembly(Type pluginType, IEnumerable<Plugin> plugins) + public InstanceBuilderAssembly(IEnumerable<Plugin> plugins) { string assemblyName = "Builders" + guidString(); _dynamicAssembly = new DynamicAssembly(assemblyName); - _pluginType = pluginType; - foreach (Plugin plugin in plugins) { processPlugin(plugin); @@ -67,20 +64,13 @@ private void processPlugin(Plugin plugin) { - if (TypeRules.CanBeCast(_pluginType, plugin.PluggedType)) - { - string className = getInstanceBuilderClassName(plugin.PluggedType); - ClassBuilder builderClass = - _dynamicAssembly.AddClass(className, typeof (InstanceBuilder)); + string className = getInstanceBuilderClassName(plugin.PluggedType); + ClassBuilder builderClass = + _dynamicAssembly.AddClass(className, typeof (InstanceBuilder)); - configureClassBuilder(builderClass, plugin); + configureClassBuilder(builderClass, plugin); - _classNames.Add(className); - } - else - { - throw new StructureMapException(104, plugin.PluggedType.FullName, _pluginType.FullName); - } + _classNames.Add(className); } public List<InstanceBuilder> Compile() Modified: trunk/Source/StructureMap/InstanceBuilderList.cs =================================================================== --- trunk/Source/StructureMap/InstanceBuilderList.cs 2008-08-10 15:57:29 UTC (rev 134) +++ trunk/Source/StructureMap/InstanceBuilderList.cs 2008-08-10 17:05:08 UTC (rev 135) @@ -99,7 +99,7 @@ } } - InstanceBuilderAssembly builderAssembly = new InstanceBuilderAssembly(_pluginType, list); + InstanceBuilderAssembly builderAssembly = new InstanceBuilderAssembly(list); return builderAssembly.Compile(); } Modified: trunk/Source/StructureMap/StructureMap.csproj =================================================================== --- trunk/Source/StructureMap/StructureMap.csproj 2008-08-10 15:57:29 UTC (rev 134) +++ trunk/Source/StructureMap/StructureMap.csproj 2008-08-10 17:05:08 UTC (rev 135) @@ -406,6 +406,7 @@ <Compile Include="Emitting\Parameters\Methods.cs" /> <Compile Include="ErrorMessages.cs" /> <Compile Include="Graph\ITypeScanner.cs" /> + <Compile Include="Graph\PluginCache.cs" /> <Compile Include="IBootstrapper.cs" /> <Compile Include="Pipeline\ConfiguredInstance.Building.cs" /> <Compile Include="Pipeline\IStructuredInstance.cs" /> Modified: trunk/Source/StructureMap.Testing/Graph/EmittingTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/EmittingTester.cs 2008-08-10 15:57:29 UTC (rev 134) +++ trunk/Source/StructureMap.Testing/Graph/EmittingTester.cs 2008-08-10 17:05:08 UTC (rev 135) @@ -27,7 +27,7 @@ Plugin plugin = new Plugin(typeof (ComplexRule)); InstanceBuilderAssembly _InstanceBuilderAssembly = - new InstanceBuilderAssembly(typeof (Rule), new Plugin[] {plugin}); + new InstanceBuilderAssembly(new Plugin[] {plugin}); List<InstanceBuilder> list = _InstanceBuilderAssembly.Compile(); builder = list[0]; @@ -62,7 +62,7 @@ { Plugin plugin = new Plugin(typeof(NoArgClass)); InstanceBuilderAssembly _InstanceBuilderAssembly = - new InstanceBuilderAssembly(typeof(NoArgClass), new Plugin[] { plugin }); + new InstanceBuilderAssembly(new Plugin[] { plugin }); List<InstanceBuilder> list = _InstanceBuilderAssembly.Compile(); builder = list[0]; @@ -76,7 +76,7 @@ { Plugin plugin = new Plugin(typeof(WithOneSetter)); InstanceBuilderAssembly _InstanceBuilderAssembly = - new InstanceBuilderAssembly(typeof(WithOneSetter), new Plugin[] { plugin }); + new InstanceBuilderAssembly(new Plugin[] { plugin }); List<InstanceBuilder> list = _InstanceBuilderAssembly.Compile(); builder = list[0]; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2008-08-10 21:38:57
|
Revision: 136 http://structuremap.svn.sourceforge.net/structuremap/?rev=136&view=rev Author: jeremydmiller Date: 2008-08-10 21:38:45 +0000 (Sun, 10 Aug 2008) Log Message: ----------- Big refactoring of the Plugin model Modified Paths: -------------- trunk/Source/StructureMap/BuildSession.cs trunk/Source/StructureMap/Configuration/DSL/ExpressionValidator.cs trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs trunk/Source/StructureMap/Configuration/FamilyParser.cs trunk/Source/StructureMap/Graph/Constructor.cs trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs trunk/Source/StructureMap/Graph/ITypeScanner.cs trunk/Source/StructureMap/Graph/Plugin.cs trunk/Source/StructureMap/Graph/PluginFamily.cs trunk/Source/StructureMap/IInstanceFactory.cs trunk/Source/StructureMap/InstanceFactory.cs trunk/Source/StructureMap/InstanceMemento.cs trunk/Source/StructureMap/ObjectFactory.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs trunk/Source/StructureMap/Pipeline/IBuildSession.cs trunk/Source/StructureMap/Pipeline/Instance.cs trunk/Source/StructureMap/StructureMap.csproj trunk/Source/StructureMap/StructureMapConfiguration.cs trunk/Source/StructureMap/StructureMapException.resx trunk/Source/StructureMap/Util/Cache.cs trunk/Source/StructureMap.Testing/Graph/ExceptionHandling/StructureMapExceptionTester.cs trunk/Source/StructureMap.Testing/Graph/GenericsPluginGraphTester.cs trunk/Source/StructureMap.Testing/Graph/InstanceFactoryTester.cs trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs trunk/Source/StructureMap.Testing/Graph/PluginGraphBuilderTester.cs trunk/Source/StructureMap.Testing/Graph/PluginTester.cs trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs Removed Paths: ------------- trunk/Source/StructureMap/Graph/PluginCollection.cs Modified: trunk/Source/StructureMap/BuildSession.cs =================================================================== --- trunk/Source/StructureMap/BuildSession.cs 2008-08-10 17:05:08 UTC (rev 135) +++ trunk/Source/StructureMap/BuildSession.cs 2008-08-10 21:38:45 UTC (rev 136) @@ -109,16 +109,6 @@ return _interceptorLibrary.FindInterceptor(actualValue.GetType()).Process(actualValue); } - public InstanceBuilder FindBuilderByType(Type pluginType, Type pluggedType) - { - return forType(pluginType).FindBuilderByType(pluggedType); - } - - public InstanceBuilder FindBuilderByConcreteKey(Type pluginType, string concreteKey) - { - return forType(pluginType).FindBuilderByConcreteKey(concreteKey); - } - public void RegisterDefault(Type pluginType, object defaultObject) { _defaults.Store(pluginType, defaultObject); Modified: trunk/Source/StructureMap/Configuration/DSL/ExpressionValidator.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/ExpressionValidator.cs 2008-08-10 17:05:08 UTC (rev 135) +++ trunk/Source/StructureMap/Configuration/DSL/ExpressionValidator.cs 2008-08-10 21:38:45 UTC (rev 136) @@ -23,6 +23,11 @@ public void IntoPluginType(Type pluginType) { + if (!Constructor.HasConstructors(_pluggedType)) + { + throw new StructureMapException(180, _pluggedType.AssemblyQualifiedName); + } + if (!TypeRules.CanBeCast(pluginType, _pluggedType)) { throw new StructureMapException( Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2008-08-10 17:05:08 UTC (rev 135) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2008-08-10 21:38:45 UTC (rev 136) @@ -78,12 +78,15 @@ public CreatePluginFamilyExpression<PLUGINTYPE> TheDefaultIsConcreteType<CONCRETETYPE>() where CONCRETETYPE : PLUGINTYPE { - ExpressionValidator.ValidatePluggabilityOf(typeof (CONCRETETYPE)).IntoPluginType(_pluginType); + var concreteType = typeof(CONCRETETYPE); + ExpressionValidator.ValidatePluggabilityOf(concreteType).IntoPluginType(_pluginType); + return alterAndContinue(family => { - Plugin plugin = family.FindPlugin(typeof (CONCRETETYPE)); - family.DefaultInstanceKey = plugin.ConcreteKey; + ConfiguredInstance instance = new ConfiguredInstance(concreteType).WithName(concreteType.AssemblyQualifiedName); + family.AddInstance(instance); + family.DefaultInstanceKey = instance.Name; }); return this; Modified: trunk/Source/StructureMap/Configuration/FamilyParser.cs =================================================================== --- trunk/Source/StructureMap/Configuration/FamilyParser.cs 2008-08-10 17:05:08 UTC (rev 135) +++ trunk/Source/StructureMap/Configuration/FamilyParser.cs 2008-08-10 21:38:45 UTC (rev 136) @@ -109,6 +109,11 @@ string context = "creating a Plugin for " + family.PluginType.AssemblyQualifiedName; _builder.WithType(pluginPath, context, pluggedType => { + if (concreteKey == string.Empty) + { + throw new StructureMapException(112, pluggedType.FullName); + } + Plugin plugin = family.AddPlugin(pluggedType, concreteKey); pluginElement.ForTextInChild("Setter/@Name").Do(prop => plugin.Setters.MarkSetterAsMandatory(prop)); Modified: trunk/Source/StructureMap/Graph/Constructor.cs =================================================================== --- trunk/Source/StructureMap/Graph/Constructor.cs 2008-08-10 17:05:08 UTC (rev 135) +++ trunk/Source/StructureMap/Graph/Constructor.cs 2008-08-10 21:38:45 UTC (rev 136) @@ -35,11 +35,6 @@ returnValue = GetGreediestConstructor(pluggedType); } - if (returnValue == null) - { - throw new StructureMapException(180, pluggedType.Name); - } - return returnValue; } Modified: trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs =================================================================== --- trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs 2008-08-10 17:05:08 UTC (rev 135) +++ trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs 2008-08-10 21:38:45 UTC (rev 136) @@ -99,31 +99,11 @@ // TODO: This code sucks. What's going on here? public static PluginFamily CreateTemplatedClone(PluginFamily baseFamily, params Type[] templateTypes) { - Type templatedType = baseFamily.PluginType.MakeGenericType(templateTypes); - PluginFamily templatedFamily = new PluginFamily(templatedType, baseFamily.Parent); - templatedFamily.DefaultInstanceKey = baseFamily.DefaultInstanceKey; - templatedFamily.Policy = baseFamily.Policy.Clone(); + + PluginFamily templatedFamily = baseFamily.CreateTemplatedClone(templateTypes); + - // Add Plugins - baseFamily.EachPlugin(plugin => - { - if (CanBePluggedIntoGenericType(baseFamily.PluginType, plugin.PluggedType, templateTypes)) - { - Plugin templatedPlugin = plugin.CreateTemplatedClone(templateTypes); - templatedFamily.AddPlugin(templatedPlugin); - } - }); - - // TODO -- Got a big problem here. Intances need to be copied over - baseFamily.EachInstance(i => - { - ((IDiagnosticInstance)i).AddTemplatedInstanceTo(templatedFamily, templateTypes); - }); - - // Need to attach the new PluginFamily to the old PluginGraph - baseFamily.Parent.PluginFamilies.Add(templatedFamily); - return templatedFamily; } Modified: trunk/Source/StructureMap/Graph/ITypeScanner.cs =================================================================== --- trunk/Source/StructureMap/Graph/ITypeScanner.cs 2008-08-10 17:05:08 UTC (rev 135) +++ trunk/Source/StructureMap/Graph/ITypeScanner.cs 2008-08-10 21:38:45 UTC (rev 136) @@ -20,7 +20,7 @@ Type pluginType = FindPluginType(type); - if (pluginType != null && Plugin.CreateForConcreteType(type) != null) + if (pluginType != null && Constructor.HasConstructors(type)) { registry.ForRequestedType(pluginType).AddInstance(new ConfiguredInstance(type)); } Modified: trunk/Source/StructureMap/Graph/Plugin.cs =================================================================== --- trunk/Source/StructureMap/Graph/Plugin.cs 2008-08-10 17:05:08 UTC (rev 135) +++ trunk/Source/StructureMap/Graph/Plugin.cs 2008-08-10 21:38:45 UTC (rev 136) @@ -22,11 +22,6 @@ public Plugin(Type pluggedType, string concreteKey) : this(pluggedType) { - if (concreteKey == string.Empty) - { - throw new StructureMapException(112, pluggedType.FullName); - } - _concreteKey = concreteKey; } @@ -129,11 +124,9 @@ return _constructor.IsValid(); } - public static Plugin CreateForConcreteType(Type type) + public bool CanBeCreated() { - if (!Constructor.HasConstructors(type)) return null; - - return new Plugin(type, DEFAULT); + return Constructor.HasConstructors(_pluggedType); } public bool HasOptionalSetters() Deleted: trunk/Source/StructureMap/Graph/PluginCollection.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginCollection.cs 2008-08-10 17:05:08 UTC (rev 135) +++ trunk/Source/StructureMap/Graph/PluginCollection.cs 2008-08-10 21:38:45 UTC (rev 136) @@ -1,134 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using StructureMap.Util; - -namespace StructureMap.Graph -{ - /// <summary> - /// Custom collection for Plugin objects - /// </summary> - public class PluginCollection : IEnumerable<Plugin> - { - private readonly PluginFamily _family; - private readonly Cache<Type, Plugin> _plugins; - - public PluginCollection(PluginFamily family) - { - _family = family; - _plugins = new Cache<Type, Plugin>(t => - { - // Reject if the PluggedType cannot be upcast to the PluginType - if (!TypeRules.CanBeCast(_family.PluginType, t)) - { - throw new StructureMapException(104, t, _family.PluginType); - } - - return new Plugin(t); - }); - } - - public Plugin[] All - { - get - { - return _plugins.GetAll(); - } - } - - public int Count - { - get { return _plugins.Count; } - } - - /// <summary> - /// Gets a Plugin by its pluggedType - /// </summary> - /// <param name="pluggedType"></param> - /// <returns></returns> - public Plugin this[Type pluggedType] - { - get { return _plugins.Retrieve(pluggedType); } - } - - /// <summary> - /// Retrieves a Plugin by its ConcreteKey - /// </summary> - /// <param name="concreteKey"></param> - /// <returns></returns> - public Plugin this[string concreteKey] - { - get - { - return _plugins.Find(plugin => plugin.ConcreteKey == concreteKey); - } - } - - #region IEnumerable<Plugin> Members - - IEnumerator<Plugin> IEnumerable<Plugin>.GetEnumerator() - { - return _plugins.GetEnumerator(); - } - - public IEnumerator GetEnumerator() - { - return ((IEnumerable<Plugin>) this).GetEnumerator(); - } - - #endregion - - - public void Add(Plugin plugin) - { - // Reject if the PluggedType cannot be upcast to the PluginType - if (!TypeRules.CanBeCast(_family.PluginType, plugin.PluggedType)) - { - throw new StructureMapException(104, plugin.PluggedType, _family.PluginType); - } - - _plugins.Store(plugin.PluggedType, plugin); - } - - /// <summary> - /// Does the PluginFamily contain a Plugin - /// </summary> - /// <param name="concreteKey"></param> - /// <returns></returns> - public bool HasPlugin(string concreteKey) - { - return this[concreteKey] != null; - } - - - public void Remove(string concreteKey) - { - Plugin plugin = this[concreteKey]; - _plugins.Remove(plugin.PluggedType); - } - - public List<Plugin> FindAutoFillablePlugins() - { - List<Plugin> list = new List<Plugin>(); - _plugins.Each(plugin => - { - if (plugin.CanBeAutoFilled) - { - list.Add(plugin); - } - }); - - return list; - } - - public bool HasPlugin(Type pluggedType) - { - return _plugins.Has(pluggedType); - } - - public void Fill(Plugin plugin) - { - _plugins.Fill(plugin.PluggedType, plugin); - } - } -} \ No newline at end of file Modified: trunk/Source/StructureMap/Graph/PluginFamily.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginFamily.cs 2008-08-10 17:05:08 UTC (rev 135) +++ trunk/Source/StructureMap/Graph/PluginFamily.cs 2008-08-10 21:38:45 UTC (rev 136) @@ -17,7 +17,7 @@ private readonly Predicate<Type> _implicitPluginFilter; private readonly Cache<string, Instance> _instances = new Cache<string, Instance>(delegate { return null; }); private readonly List<InstanceMemento> _mementoList = new List<InstanceMemento>(); - private readonly PluginCollection _plugins; + private Cache<string, Plugin> _pluggedTypes = new Cache<string, Plugin>(); private readonly Type _pluginType; private IBuildPolicy _buildPolicy = new BuildPolicy(); private string _defaultKey = string.Empty; @@ -34,7 +34,6 @@ { _parent = parent; _pluginType = pluginType; - _plugins = new PluginCollection(this); PluginFamilyAttribute.ConfigureFamily(this); @@ -44,10 +43,10 @@ if (IsConcrete(pluginType)) { - Plugin plugin = Plugin.CreateForConcreteType(pluginType); - if (plugin != null) + Plugin plugin = PluginCache.GetPlugin(pluginType); + if (plugin.CanBeCreated()) { - _plugins.Add(plugin); + AddPlugin(pluginType, Plugin.DEFAULT); } } } @@ -151,16 +150,21 @@ private void discoverImplicitInstances() { - List<Plugin> list = _plugins.FindAutoFillablePlugins(); - list.RemoveAll( - plugin => _instances.Exists(instance => instance.Matches(plugin))); - - foreach (Plugin plugin in list) + _pluggedTypes.Each((key, plugin) => { - AddInstance(plugin.CreateImplicitInstance()); - } + if (plugin.CanBeAutoFilled && !hasInstanceWithPluggedType(plugin)) + { + var instance = new ConfiguredInstance(plugin.PluggedType).WithName(key); + AddInstance(instance); + } + }); } + private bool hasInstanceWithPluggedType(Plugin plugin) + { + return _instances.Exists(instance => instance.Matches(plugin)); + } + public void EachInstance(Action<Instance> action) { _instances.Each(action); @@ -178,40 +182,47 @@ { if (!HasPlugin(pluggedType)) { - Plugin plugin = new Plugin(pluggedType); - _plugins.Add(plugin); + AddPlugin(pluggedType); } } } public bool HasPlugin(Type pluggedType) { - return _plugins.HasPlugin(pluggedType); + return _pluggedTypes.Exists(plugin => plugin.PluggedType == pluggedType); } - public Plugin AddPlugin(Type pluggedType) + private void assertPluggability(Type pluggedType) { - return _plugins[pluggedType]; + if (!CanBeCast(_pluginType, pluggedType)) + { + throw new StructureMapException(104, pluggedType, _pluginType); + } + + if (!Constructor.HasConstructors(pluggedType)) + { + throw new StructureMapException(180, pluggedType.AssemblyQualifiedName); + } } - public Plugin AddPlugin(Type pluggedType, string key) + public Plugin AddPlugin(Type pluggedType) { - Plugin plugin = new Plugin(pluggedType, key); - AddPlugin(plugin); + assertPluggability(pluggedType); + Plugin plugin = PluginCache.GetPlugin(pluggedType); + _pluggedTypes.Store(plugin.ConcreteKey, plugin); + return plugin; } - [Obsolete("Wanna make private")] - public void AddPlugin(Plugin plugin) + public Plugin AddPlugin(Type pluggedType, string key) { - if (_plugins.HasPlugin(plugin.ConcreteKey)) - { - _parent.Log.RegisterError(113, plugin.ConcreteKey, _pluginType); - } + assertPluggability(pluggedType); + Plugin plugin = PluginCache.GetPlugin(pluggedType); + _pluggedTypes.Store(key, plugin); - _plugins.Add(plugin); + return plugin; } public Instance GetDefaultInstance() @@ -241,7 +252,7 @@ public int PluginCount { - get { return _plugins.Count; } + get { return _pluggedTypes.Count; } } /// <summary> @@ -268,9 +279,10 @@ #endregion + [Obsolete("is this really important?")] public Plugin FindPlugin(Type pluggedType) { - return _plugins[pluggedType]; + return _pluggedTypes.Find(p => p.PluggedType == pluggedType); } public void AddDefaultMemento(InstanceMemento memento) @@ -303,11 +315,7 @@ public void ImportFrom(PluginFamily source) { source.EachInstance(instance => _instances.Fill(instance.Name, instance)); - - foreach (Plugin plugin in source._plugins) - { - _plugins.Fill(plugin); - } + source._pluggedTypes.Each((key, plugin) => _pluggedTypes.Fill(key, plugin)); } public Instance FirstInstance() @@ -317,25 +325,37 @@ public Plugin FindPlugin(string concreteKey) { - return _plugins[concreteKey]; + if (_pluggedTypes.Has(concreteKey)) + { + return _pluggedTypes.Retrieve(concreteKey); + } + + return null; } public bool HasPlugin(string concreteKey) { - return _plugins.HasPlugin(concreteKey); + return _pluggedTypes.Has(concreteKey); } - public void EachPlugin(Action<Plugin> action) + public PluginFamily CreateTemplatedClone(Type[] templateTypes) { - foreach (Plugin plugin in _plugins) + Type templatedType = _pluginType.MakeGenericType(templateTypes); + PluginFamily templatedFamily = new PluginFamily(templatedType, Parent); + templatedFamily.DefaultInstanceKey = DefaultInstanceKey; + templatedFamily.Policy = Policy.Clone(); + + + // TODO -- Got a big problem here. Intances need to be copied over + EachInstance(i => { - action(plugin); - } - } + ((IDiagnosticInstance)i).AddTemplatedInstanceTo(templatedFamily, templateTypes); + }); - public IEnumerable<Plugin> GetAllPlugins() - { - return _plugins.All; + // Need to attach the new PluginFamily to the old PluginGraph + Parent.PluginFamilies.Add(templatedFamily); + + return templatedFamily; } } } \ No newline at end of file Modified: trunk/Source/StructureMap/IInstanceFactory.cs =================================================================== --- trunk/Source/StructureMap/IInstanceFactory.cs 2008-08-10 17:05:08 UTC (rev 135) +++ trunk/Source/StructureMap/IInstanceFactory.cs 2008-08-10 21:38:45 UTC (rev 136) @@ -19,8 +19,6 @@ object Build(IBuildSession session, Instance instance); Instance FindInstance(string name); - InstanceBuilder FindBuilderByType(Type pluggedType); - InstanceBuilder FindBuilderByConcreteKey(string concreteKey); void ForEachInstance(Action<Instance> action); void ImportFrom(PluginFamily family); void AcceptVisitor(IPipelineGraphVisitor visitor, Instance defaultInstance); Modified: trunk/Source/StructureMap/InstanceFactory.cs =================================================================== --- trunk/Source/StructureMap/InstanceFactory.cs 2008-08-10 17:05:08 UTC (rev 135) +++ trunk/Source/StructureMap/InstanceFactory.cs 2008-08-10 21:38:45 UTC (rev 136) @@ -11,8 +11,6 @@ /// </summary> public class InstanceFactory : IInstanceFactory { - private readonly InstanceBuilderList _instanceBuilders; - private readonly Cache<string, Instance> _instances = new Cache<string, Instance>(delegate { return null; }); @@ -41,7 +39,6 @@ _policy = family.Policy; _pluginType = family.PluginType; - _instanceBuilders = new InstanceBuilderList(family.PluginType, family.GetAllPlugins()); family.EachInstance(AddInstance); @@ -81,16 +78,6 @@ get { return _pluginType; } } - public InstanceBuilder FindBuilderByType(Type pluggedType) - { - return _instanceBuilders.FindByType(pluggedType); - } - - public InstanceBuilder FindBuilderByConcreteKey(string concreteKey) - { - return _instanceBuilders.FindByConcreteKey(concreteKey); - } - public void ForEachInstance(Action<Instance> action) { _instances.Each(action); @@ -105,7 +92,6 @@ [Obsolete] public Instance AddType<T>() { - InstanceBuilder builder = _instanceBuilders.FindByType(typeof (T)); ConfiguredInstance instance = new ConfiguredInstance(typeof (T)).WithName(TypePath.GetAssemblyQualifiedName(typeof (T))); @@ -141,7 +127,6 @@ public void ImportFrom(PluginFamily family) { - _instanceBuilders.Add(family.GetAllPlugins()); family.EachInstance(instance => _instances.Fill(instance.Name, instance)); } Modified: trunk/Source/StructureMap/InstanceMemento.cs =================================================================== --- trunk/Source/StructureMap/InstanceMemento.cs 2008-08-10 17:05:08 UTC (rev 135) +++ trunk/Source/StructureMap/InstanceMemento.cs 2008-08-10 21:38:45 UTC (rev 136) @@ -84,7 +84,7 @@ public virtual Plugin FindPlugin(PluginFamily family) { - Plugin plugin = family.FindPlugin(innerConcreteKey) ?? getPluginByType(family) ?? + Plugin plugin = getPluginByType(family) ?? family.FindPlugin(innerConcreteKey ?? string.Empty) ?? family.FindPlugin(Plugin.DEFAULT); if (plugin == null) @@ -105,8 +105,7 @@ } Type pluggedType = new TypePath(pluggedTypeName).FindType(); - - return family.FindPlugin(pluggedType); + return PluginCache.GetPlugin(pluggedType); } /// <summary> Modified: trunk/Source/StructureMap/ObjectFactory.cs =================================================================== --- trunk/Source/StructureMap/ObjectFactory.cs 2008-08-10 17:05:08 UTC (rev 135) +++ trunk/Source/StructureMap/ObjectFactory.cs 2008-08-10 21:38:45 UTC (rev 136) @@ -218,6 +218,8 @@ Container container = new Container(graph); container.SetDefaultsToProfile(_profile); + PluginCache.Compile(); + return container; } Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs 2008-08-10 17:05:08 UTC (rev 135) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs 2008-08-10 21:38:45 UTC (rev 136) @@ -87,8 +87,7 @@ protected override object build(Type pluginType, IBuildSession session) { - InstanceBuilder builder = session.FindBuilderByType(pluginType, _pluggedType); - + InstanceBuilder builder = PluginCache.FindBuilder(_pluggedType); return ((IConfiguredInstance) this).Build(pluginType, session, builder); } Modified: trunk/Source/StructureMap/Pipeline/IBuildSession.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/IBuildSession.cs 2008-08-10 17:05:08 UTC (rev 135) +++ trunk/Source/StructureMap/Pipeline/IBuildSession.cs 2008-08-10 21:38:45 UTC (rev 136) @@ -9,8 +9,6 @@ Array CreateInstanceArray(Type pluginType, Instance[] instances); object CreateInstance(Type pluginType); object ApplyInterception(Type pluginType, object actualValue); - InstanceBuilder FindBuilderByType(Type pluginType, Type pluggedType); - InstanceBuilder FindBuilderByConcreteKey(Type pluginType, string concreteKey); void RegisterDefault(Type pluginType, object defaultObject); } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/Instance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/Instance.cs 2008-08-10 17:05:08 UTC (rev 135) +++ trunk/Source/StructureMap/Pipeline/Instance.cs 2008-08-10 21:38:45 UTC (rev 136) @@ -133,11 +133,6 @@ protected abstract object build(Type pluginType, IBuildSession session); - protected virtual Plugin findPlugin(PluginCollection plugins) - { - return null; - } - protected virtual Instance findMasterInstance(PluginFamily family, string profileName, GraphLog log) { return this; Modified: trunk/Source/StructureMap/StructureMap.csproj =================================================================== --- trunk/Source/StructureMap/StructureMap.csproj 2008-08-10 17:05:08 UTC (rev 135) +++ trunk/Source/StructureMap/StructureMap.csproj 2008-08-10 21:38:45 UTC (rev 136) @@ -280,9 +280,6 @@ <Compile Include="Graph\Plugin.cs"> <SubType>Code</SubType> </Compile> - <Compile Include="Graph\PluginCollection.cs"> - <SubType>Code</SubType> - </Compile> <Compile Include="Graph\PluginFamily.cs"> <SubType>Code</SubType> </Compile> Modified: trunk/Source/StructureMap/StructureMapConfiguration.cs =================================================================== --- trunk/Source/StructureMap/StructureMapConfiguration.cs 2008-08-10 17:05:08 UTC (rev 135) +++ trunk/Source/StructureMap/StructureMapConfiguration.cs 2008-08-10 21:38:45 UTC (rev 136) @@ -85,6 +85,8 @@ _registries.Add(_registry); UseDefaultStructureMapConfigFile = false; IgnoreStructureMapConfig = false; + + PluginCache.ResetAll(); } public static void RegisterInterceptor(TypeInterceptor interceptor) Modified: trunk/Source/StructureMap/StructureMapException.resx =================================================================== --- trunk/Source/StructureMap/StructureMapException.resx 2008-08-10 17:05:08 UTC (rev 135) +++ trunk/Source/StructureMap/StructureMapException.resx 2008-08-10 21:38:45 UTC (rev 136) @@ -135,9 +135,6 @@ <value>Missing a mandatory "ConcreteKey" attribute in a <Plugin> node for Type "{0}"</value> <comment>change wording</comment> </data> - <data name="113" xml:space="preserve"> - <value>Duplicate ConcreteKey ({0}) values in PluginType "{1}"</value> - </data> <data name="200" xml:space="preserve"> <value>Could not find an Instance named "{0}" for PluginType {1}</value> </data> @@ -188,7 +185,7 @@ <value>Could not create the type {0} specified in the [PluginFamily] attribute on PluginFamily {1}</value> </data> <data name="180" xml:space="preserve"> - <value>Cannot construct a Plugin for Class {0}, No public constructor found.</value> + <value>StructureMap cannot construct objects of Class {0} because there is no public constructor found.</value> </data> <data name="115" xml:space="preserve"> <value>An exception occurred while trying to create an InstanceFactory for PluginType {0}</value> Modified: trunk/Source/StructureMap/Util/Cache.cs =================================================================== --- trunk/Source/StructureMap/Util/Cache.cs 2008-08-10 17:05:08 UTC (rev 135) +++ trunk/Source/StructureMap/Util/Cache.cs 2008-08-10 21:38:45 UTC (rev 136) @@ -26,6 +26,11 @@ _onMissing = onMissing; } + public void Clear() + { + _values.Clear(); + } + public Func<VALUE, KEY> GetKey { get { return _getKey; } @@ -94,6 +99,14 @@ } } + public void Each(Action<KEY, VALUE> action) + { + foreach (var pair in _values) + { + action(pair.Key, pair.Value); + } + } + public bool Has(KEY key) { return _values.ContainsKey(key); @@ -146,5 +159,6 @@ _values.Remove(key); } } + } } Modified: trunk/Source/StructureMap.Testing/Graph/ExceptionHandling/StructureMapExceptionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/ExceptionHandling/StructureMapExceptionTester.cs 2008-08-10 17:05:08 UTC (rev 135) +++ trunk/Source/StructureMap.Testing/Graph/ExceptionHandling/StructureMapExceptionTester.cs 2008-08-10 21:38:45 UTC (rev 136) @@ -153,24 +153,7 @@ "); } - [Test] - public void Log_113_if_a_duplicate_Plugin_ConcreteKey_is_detected() - { - assertErrorIsLogged(113, - @" - <StructureMap> - <Assembly Name='StructureMap.Testing.Widget'/> - - <PluginFamily Type='StructureMap.Testing.Widget.IWidget' Assembly='StructureMap.Testing.Widget' DefaultKey=''> - <Plugin Assembly='StructureMap.Testing.Widget' Type='StructureMap.Testing.Widget.NotPluggableWidget' ConcreteKey='Dup'/> - <Plugin Assembly='StructureMap.Testing.Widget' Type='StructureMap.Testing.Widget.NotPluggableWidget' ConcreteKey='Dup'/> - </PluginFamily> - </StructureMap> - -"); - } - [Test] public void Log_130_if_an_error_occurs_when_trying_to_create_an_interceptor_configured_in_xml() { Modified: trunk/Source/StructureMap.Testing/Graph/GenericsPluginGraphTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/GenericsPluginGraphTester.cs 2008-08-10 17:05:08 UTC (rev 135) +++ trunk/Source/StructureMap.Testing/Graph/GenericsPluginGraphTester.cs 2008-08-10 21:38:45 UTC (rev 136) @@ -76,37 +76,10 @@ Assert.IsNotNull(templatedFamily); Assert.AreEqual(typeof (IGenericService<int>), templatedFamily.PluginType); - Assert.AreEqual(3, templatedFamily.PluginCount); - Assert.IsNotNull(templatedFamily.FindPlugin(typeof (GenericService<int>))); - Assert.IsNotNull(templatedFamily.FindPlugin(typeof (SecondGenericService<int>))); - Assert.IsNotNull(templatedFamily.FindPlugin(typeof (ThirdGenericService<int>))); } - [Test] - public void BuildTemplatedFamilyWithThreeTemplateParameters() - { - PluginGraph pluginGraph = new PluginGraph(); - PluginFamily family = pluginGraph.FindFamily(typeof (IGenericService3<,,>)); - family.AddPlugin(typeof (GenericService3<,,>), "Default"); - family.AddPlugin(typeof (SecondGenericService3<,,>), "Second"); - family.AddPlugin(typeof (ThirdGenericService3<,,>), "Third"); - PluginFamily templatedFamily = GenericsPluginGraph.CreateTemplatedClone(family, typeof (int), typeof (bool), - typeof (string)); - Assert.IsNotNull(templatedFamily); - Assert.AreEqual(typeof (IGenericService3<int, bool, string>), templatedFamily.PluginType); - - Assert.AreEqual(3, templatedFamily.PluginCount); - - Assert.AreEqual(typeof (GenericService3<int, bool, string>), templatedFamily.FindPlugin("Default").PluggedType); - Assert.AreEqual(typeof (SecondGenericService3<int, bool, string>), - templatedFamily.FindPlugin("Second").PluggedType); - Assert.AreEqual(typeof (ThirdGenericService3<int, bool, string>), - templatedFamily.FindPlugin("Third").PluggedType); - } - - [Test] public void DirectImplementationOfInterfaceCanBeCast() { Modified: trunk/Source/StructureMap.Testing/Graph/InstanceFactoryTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/InstanceFactoryTester.cs 2008-08-10 17:05:08 UTC (rev 135) +++ trunk/Source/StructureMap.Testing/Graph/InstanceFactoryTester.cs 2008-08-10 21:38:45 UTC (rev 136) @@ -55,23 +55,6 @@ } [Test] - public void Import_from_family_picks_up_new_InstanceBuilders() - { - InstanceFactory factory = new InstanceFactory(typeof (IWidget)); - - PluginFamily family = new PluginFamily(typeof (IWidget)); - family.AddPlugin(typeof (AWidget)); - family.AddPlugin(typeof (ColorWidget)); - factory.ImportFrom(family); - - InstanceBuilder builder = factory.FindBuilderByType(typeof (AWidget)); - Assert.IsNotNull(builder); - - builder = factory.FindBuilderByType(typeof (ColorWidget)); - Assert.IsNotNull(builder); - } - - [Test] public void Import_from_family_picks_up_new_instances() { InstanceFactory factory = new InstanceFactory(typeof (IWidget)); Modified: trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs 2008-08-10 17:05:08 UTC (rev 135) +++ trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs 2008-08-10 21:38:45 UTC (rev 136) @@ -153,11 +153,8 @@ public void If_PluginType_is_concrete_automatically_add_a_plugin_called_default() { PluginFamily family = new PluginFamily(GetType()); - Assert.AreEqual(1, family.PluginCount); - - Plugin plugin = family.FindPlugin(GetType()); - Assert.AreEqual(Plugin.DEFAULT, plugin.ConcreteKey); - Assert.AreEqual(GetType(), plugin.PluggedType); + family.PluginCount.ShouldEqual(1); + family.FindPlugin(Plugin.DEFAULT).PluggedType.ShouldEqual(GetType()); } [Test] Modified: trunk/Source/StructureMap.Testing/Graph/PluginGraphBuilderTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/PluginGraphBuilderTester.cs 2008-08-10 17:05:08 UTC (rev 135) +++ trunk/Source/StructureMap.Testing/Graph/PluginGraphBuilderTester.cs 2008-08-10 21:38:45 UTC (rev 136) @@ -164,9 +164,7 @@ public void GotPluginThatIsAddedInConfigXml() { PluginFamily family = graph.FindFamily(typeof (IWidget)); - Plugin plugin = family.FindPlugin(typeof (NotPluggableWidget)); - Assert.IsNotNull(plugin); - Assert.AreEqual("NotPluggable", plugin.ConcreteKey); + family.FindPlugin("NotPluggable").PluggedType.ShouldEqual(typeof (NotPluggableWidget)); } Modified: trunk/Source/StructureMap.Testing/Graph/PluginTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/PluginTester.cs 2008-08-10 17:05:08 UTC (rev 135) +++ trunk/Source/StructureMap.Testing/Graph/PluginTester.cs 2008-08-10 21:38:45 UTC (rev 136) @@ -3,6 +3,7 @@ using NUnit.Framework; using Rhino.Mocks; using StructureMap.Attributes; +using StructureMap.Configuration.DSL; using StructureMap.Graph; using StructureMap.Pipeline; using StructureMap.Testing.Widget; @@ -275,18 +276,15 @@ { try { - Constructor ctor = new Constructor(typeof (ClassWithNoConstructor)); - Assert.Fail("Should have thrown a StructureMapException"); + new Registry().ForRequestedType<ClassWithNoConstructor>().TheDefaultIsConcreteType<ClassWithNoConstructor>(); } catch (StructureMapException ex) { Assert.AreEqual(180, ex.ErrorCode); - Assert.AreEqual( - "StructureMap Exception Code: 180\nCannot construct a Plugin for Class ClassWithNoConstructor, No public constructor found.", - ex.Message); } } + [Test] public void Visit_arguments() { @@ -313,6 +311,18 @@ plugin.VisitArguments(visitor); } } + + [Test] + public void CanBeCreated_positive_with_a_public_constructor() + { + new Plugin(typeof(LotsOfStuff)).CanBeCreated().ShouldBeTrue(); + } + + [Test] + public void CanBeCreated_is_negative_with_no_public_constructors() + { + new Plugin(typeof(ClassWithNoConstructor)).CanBeCreated().ShouldBeFalse(); + } } public class LotsOfStuff Modified: trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs 2008-08-10 17:05:08 UTC (rev 135) +++ trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs 2008-08-10 21:38:45 UTC (rev 136) @@ -183,7 +183,7 @@ using (mocks.Record()) { - Expect.Call(session.FindBuilderByType(thePluginType, thePluggedType)).Return(builder); + PluginCache.Store(thePluggedType, builder); Expect.Call(builder.BuildInstance(instance, session)).Return(new object()); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2008-08-11 01:56:27
|
Revision: 137 http://structuremap.svn.sourceforge.net/structuremap/?rev=137&view=rev Author: jeremydmiller Date: 2008-08-11 01:56:24 +0000 (Mon, 11 Aug 2008) Log Message: ----------- added some unit tests for Xml optional properties. Strangely enough, it worked already Modified Paths: -------------- trunk/Source/StructureMap/Graph/PluginFamilyCollection.cs trunk/Source/StructureMap/Graph/PluginGraph.cs trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs Modified: trunk/Source/StructureMap/Graph/PluginFamilyCollection.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginFamilyCollection.cs 2008-08-10 21:38:45 UTC (rev 136) +++ trunk/Source/StructureMap/Graph/PluginFamilyCollection.cs 2008-08-11 01:56:24 UTC (rev 137) @@ -37,6 +37,16 @@ get { return _pluginFamilies.Count; } } + public IEnumerable<PluginFamily> All + { + get + { + PluginFamily[] families = new PluginFamily[_pluginFamilies.Count]; + _pluginFamilies.Values.CopyTo(families, 0); + return families; + } + } + #region IEnumerable<PluginFamily> Members IEnumerator<PluginFamily> IEnumerable<PluginFamily>.GetEnumerator() Modified: trunk/Source/StructureMap/Graph/PluginGraph.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginGraph.cs 2008-08-10 21:38:45 UTC (rev 136) +++ trunk/Source/StructureMap/Graph/PluginGraph.cs 2008-08-11 01:56:24 UTC (rev 137) @@ -104,7 +104,7 @@ _assemblies.ScanForStructureMapObjects(this); } - foreach (PluginFamily family in _pluginFamilies) + foreach (PluginFamily family in _pluginFamilies.All) { family.Seal(); } Modified: trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs 2008-08-10 21:38:45 UTC (rev 136) +++ trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs 2008-08-11 01:56:24 UTC (rev 137) @@ -1,9 +1,11 @@ using System; +using System.Diagnostics; using System.Drawing; using System.Linq.Expressions; using NUnit.Framework; using StructureMap.Configuration.DSL; using StructureMap.Pipeline; +using StructureMap.Testing.TestData; using StructureMap.Testing.Widget; namespace StructureMap.Testing.Pipeline @@ -92,7 +94,7 @@ } [Test] - public void one_optional_child_setter() + public void one_optional_child_setter_with_the_setter_property_defined() { var container = new Container(r => r.ForRequestedType<ClassWithDependency>().TheDefaultIs( Instance<ClassWithDependency>().Child("Rule").Is(new ColorRule("Red")) @@ -102,7 +104,70 @@ container.GetInstance<ClassWithDependency>().Rule.ShouldBeOfType(typeof(ColorRule)); } + [Test] + public void one_optional_child_setter_without_the_setter_property_defined() + { + var container = new Container(r => r.ForRequestedType<ClassWithDependency>().TheDefaultIs( + Instance<ClassWithDependency>()) + + ); + + container.GetInstance<ClassWithDependency>().Rule.ShouldBeNull(); + } + + [Test] + public void read_instance_from_xml_with_optional_setter_defined() + { + Debug.WriteLine(typeof(ClassWithDependency).AssemblyQualifiedName); + + var graph = DataMother.BuildPluginGraphFromXml(@" +<StructureMap MementoStyle='Attribute'> + <DefaultInstance + PluginType='StructureMap.Testing.Pipeline.ClassWithDependency, StructureMap.Testing' + PluggedType='StructureMap.Testing.Pipeline.ClassWithDependency, StructureMap.Testing'> + + <Rule PluggedType='StructureMap.Testing.Widget.ColorRule, StructureMap.Testing.Widget' color='Red' /> + + + + </DefaultInstance> +</StructureMap> + +"); + + Container container = new Container(graph); + + container.GetInstance<ClassWithDependency>().Rule.IsType<ColorRule>().Color.ShouldEqual("Red"); + } + + + + [Test] + public void read_instance_from_xml_with_optional_setter_not_defined() + { + Debug.WriteLine(typeof(ClassWithDependency).AssemblyQualifiedName); + + var graph = DataMother.BuildPluginGraphFromXml(@" +<StructureMap MementoStyle='Attribute'> + <DefaultInstance + PluginType='StructureMap.Testing.Pipeline.ClassWithDependency, StructureMap.Testing' + PluggedType='StructureMap.Testing.Pipeline.ClassWithDependency, StructureMap.Testing'> + + </DefaultInstance> +</StructureMap> + +"); + + Container container = new Container(graph); + + container.GetInstance<ClassWithDependency>().Rule.ShouldBeNull(); + } + + + + + [Test] public void one_optional_child_setter2() { var container = new Container(r => r.ForRequestedType<ClassWithDependency>().TheDefaultIs( This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2008-08-13 21:51:32
|
Revision: 138 http://structuremap.svn.sourceforge.net/structuremap/?rev=138&view=rev Author: jeremydmiller Date: 2008-08-13 21:51:26 +0000 (Wed, 13 Aug 2008) Log Message: ----------- changes for setter injection problems Modified Paths: -------------- trunk/Source/StructureMap/Configuration/DSL/Registry.cs trunk/Source/StructureMap/Container.cs trunk/Source/StructureMap/Emitting/Parameters/ChildParameterEmitter.cs trunk/Source/StructureMap/Graph/Plugin.cs trunk/Source/StructureMap/Graph/PluginGraph.cs trunk/Source/StructureMap/Graph/SetterPropertyCollection.cs trunk/Source/StructureMap/ObjectFactory.cs trunk/Source/StructureMap.Testing/Graph/PluginTester.cs trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs Added Paths: ----------- trunk/Source/StructureMap/Graph/PluginCache.cs Modified: trunk/Source/StructureMap/Configuration/DSL/Registry.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2008-08-11 01:56:24 UTC (rev 137) +++ trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2008-08-13 21:51:26 UTC (rev 138) @@ -242,5 +242,11 @@ { return 0; } + + public CreatePluginFamilyExpression<PLUGINTYPE> FillAllPropertiesOfType<PLUGINTYPE>() + { + PluginCache.AddFilledType(typeof(PLUGINTYPE)); + return ForRequestedType<PLUGINTYPE>(); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Container.cs =================================================================== --- trunk/Source/StructureMap/Container.cs 2008-08-11 01:56:24 UTC (rev 137) +++ trunk/Source/StructureMap/Container.cs 2008-08-13 21:51:26 UTC (rev 138) @@ -59,6 +59,8 @@ pluginGraph.Log.AssertFailures(); _pipelineGraph = new PipelineGraph(pluginGraph); + + PluginCache.Compile(); } protected MissingFactoryFunction onMissingFactory Modified: trunk/Source/StructureMap/Emitting/Parameters/ChildParameterEmitter.cs =================================================================== --- trunk/Source/StructureMap/Emitting/Parameters/ChildParameterEmitter.cs 2008-08-11 01:56:24 UTC (rev 137) +++ trunk/Source/StructureMap/Emitting/Parameters/ChildParameterEmitter.cs 2008-08-13 21:51:26 UTC (rev 138) @@ -40,6 +40,14 @@ putChildObjectOnStack(ilgen, property.Name, property.PropertyType); MethodInfo method = property.GetSetMethod(); + + if (method == null) + { + string message = string.Format("Could not find a Setter for property {0} of type {1}", property.Name, + property.DeclaringType.FullName); + throw new ApplicationException(message); + } + ilgen.Emit(OpCodes.Callvirt, method); } } Modified: trunk/Source/StructureMap/Graph/Plugin.cs =================================================================== --- trunk/Source/StructureMap/Graph/Plugin.cs 2008-08-11 01:56:24 UTC (rev 137) +++ trunk/Source/StructureMap/Graph/Plugin.cs 2008-08-13 21:51:26 UTC (rev 138) @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Reflection; using StructureMap.Pipeline; @@ -147,5 +148,16 @@ return templatedPlugin; } + + public void SetFilledTypes(IList<Type> types) + { + foreach (SetterProperty setter in _setters) + { + if (types.Contains(setter.Property.PropertyType)) + { + setter.IsMandatory = true; + } + } + } } } \ No newline at end of file Added: trunk/Source/StructureMap/Graph/PluginCache.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginCache.cs (rev 0) +++ trunk/Source/StructureMap/Graph/PluginCache.cs 2008-08-13 21:51:26 UTC (rev 138) @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using StructureMap.Emitting; +using StructureMap.Util; + +namespace StructureMap.Graph +{ + public static class PluginCache + { + private static readonly Cache<Type, InstanceBuilder> _builders; + private static readonly Cache<Type, Plugin> _plugins; + private static List<Type> _filledTypes = new List<Type>(); + + static PluginCache() + { + _plugins = new Cache<Type, Plugin>(t => new Plugin(t)); + _builders = new Cache<Type, InstanceBuilder>(t => + { + Plugin plugin = _plugins.Retrieve(t); + plugin.SetFilledTypes(_filledTypes); + return new InstanceBuilderAssembly(new[] {plugin}).Compile()[0]; + }); + } + + public static Plugin GetPlugin(Type pluggedType) + { + return _plugins.Retrieve(pluggedType); + } + + public static InstanceBuilder FindBuilder(Type pluggedType) + { + return _builders.Retrieve(pluggedType); + } + + public static void Compile() + { + lock (typeof (PluginCache)) + { + IEnumerable<Plugin> plugins = _plugins.Where(plugin => pluginHasNoBuilder(plugin) && plugin.CanBeCreated()); + createAndStoreBuilders(plugins); + } + } + + private static void createAndStoreBuilders(IEnumerable<Plugin> plugins) + { + foreach (Plugin plugin in plugins) + { + plugin.SetFilledTypes(_filledTypes); + } + + var assembly = new InstanceBuilderAssembly(plugins); + assembly.Compile().ForEach(b => _builders.Store(b.PluggedType, b)); + } + + private static bool pluginHasNoBuilder(Plugin plugin) + { + return !_builders.Has(plugin.PluggedType); + } + + public static void Store(Type pluggedType, InstanceBuilder builder) + { + _builders.Store(pluggedType, builder); + } + + internal static void ResetAll() + { + lock (typeof(PluginCache)) + { + _builders.Clear(); + _plugins.Clear(); + } + } + + public static void AddFilledType(Type type) + { + _filledTypes.Add(type); + } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap/Graph/PluginGraph.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginGraph.cs 2008-08-11 01:56:24 UTC (rev 137) +++ trunk/Source/StructureMap/Graph/PluginGraph.cs 2008-08-13 21:51:26 UTC (rev 138) @@ -23,7 +23,8 @@ private readonly ProfileManager _profileManager = new ProfileManager(); private readonly bool _useExternalRegistries = true; private bool _sealed = false; - private List<Registry> _registries = new List<Registry>(); + private readonly List<Registry> _registries = new List<Registry>(); + /// <summary> @@ -111,6 +112,8 @@ _profileManager.Seal(this); + + _sealed = true; } Modified: trunk/Source/StructureMap/Graph/SetterPropertyCollection.cs =================================================================== --- trunk/Source/StructureMap/Graph/SetterPropertyCollection.cs 2008-08-11 01:56:24 UTC (rev 137) +++ trunk/Source/StructureMap/Graph/SetterPropertyCollection.cs 2008-08-13 21:51:26 UTC (rev 138) @@ -23,7 +23,7 @@ foreach (PropertyInfo property in plugin.PluggedType.GetProperties()) { - if (property.CanWrite) + if (property.CanWrite && property.GetSetMethod(false) != null) { SetterProperty setter = new SetterProperty(property); _properties.Add(setter); Modified: trunk/Source/StructureMap/ObjectFactory.cs =================================================================== --- trunk/Source/StructureMap/ObjectFactory.cs 2008-08-11 01:56:24 UTC (rev 137) +++ trunk/Source/StructureMap/ObjectFactory.cs 2008-08-13 21:51:26 UTC (rev 138) @@ -218,8 +218,6 @@ Container container = new Container(graph); container.SetDefaultsToProfile(_profile); - PluginCache.Compile(); - return container; } Modified: trunk/Source/StructureMap.Testing/Graph/PluginTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/PluginTester.cs 2008-08-11 01:56:24 UTC (rev 137) +++ trunk/Source/StructureMap.Testing/Graph/PluginTester.cs 2008-08-13 21:51:26 UTC (rev 138) @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Reflection; using NUnit.Framework; using Rhino.Mocks; @@ -323,6 +324,50 @@ { new Plugin(typeof(ClassWithNoConstructor)).CanBeCreated().ShouldBeFalse(); } + + public class ClassWithProperties + { + public IEngine Engine { get; set; } + public IAutomobile Car { get; set; } + public IGateway Gateway { get; set; } + } + + [Test] + public void SetFilledTypes_1() + { + Plugin plugin = new Plugin(typeof(ClassWithProperties)); + plugin.SetFilledTypes(new List<Type>() {typeof (IEngine), typeof (IAutomobile)}); + + plugin.Setters.IsMandatory("Engine").ShouldBeTrue(); + plugin.Setters.IsMandatory("Car").ShouldBeTrue(); + plugin.Setters.IsMandatory("Gateway").ShouldBeFalse(); + } + + + [Test] + public void SetFilledTypes_2() + { + Plugin plugin = new Plugin(typeof(ClassWithProperties)); + plugin.SetFilledTypes(new List<Type>() { typeof(IGateway), typeof(IAutomobile) }); + + plugin.Setters.IsMandatory("Engine").ShouldBeFalse(); + plugin.Setters.IsMandatory("Car").ShouldBeTrue(); + plugin.Setters.IsMandatory("Gateway").ShouldBeTrue(); + } + + + + [Test] + public void SetFilledTypes_3() + { + Plugin plugin = new Plugin(typeof(ClassWithProperties)); + plugin.SetFilledTypes(new List<Type>() { typeof(IGateway)}); + + plugin.Setters.IsMandatory("Engine").ShouldBeFalse(); + plugin.Setters.IsMandatory("Car").ShouldBeFalse(); + plugin.Setters.IsMandatory("Gateway").ShouldBeTrue(); + } + } public class LotsOfStuff @@ -406,8 +451,12 @@ _breed = breed; _engine = engine; } + + } + + [Pluggable("Mustang")] public class Mustang : IAutomobile { Modified: trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs 2008-08-11 01:56:24 UTC (rev 137) +++ trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs 2008-08-13 21:51:26 UTC (rev 138) @@ -179,6 +179,17 @@ } [Test] + public void using_the_FillAllPropertiesOf() + { + var container = + new Container( + r => + r.FillAllPropertiesOfType<Rule>().TheDefaultIs(new ColorRule("Red"))); + + container.GetInstance<ClassWithDependency>().Rule.ShouldBeOfType(typeof(ColorRule)); + } + + [Test] public void one_optional_child_array_setter() { var container = new Container(r => r.ForRequestedType<ClassWithDependency>().TheDefaultIs( This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2008-08-16 16:44:34
|
Revision: 139 http://structuremap.svn.sourceforge.net/structuremap/?rev=139&view=rev Author: jeremydmiller Date: 2008-08-16 16:44:23 +0000 (Sat, 16 Aug 2008) Log Message: ----------- getting ready for build conventions Modified Paths: -------------- trunk/Source/StructureMap/BuildSession.cs trunk/Source/StructureMap/Container.cs trunk/Source/StructureMap/Emitting/BuildInstanceMethod.cs trunk/Source/StructureMap/Emitting/DynamicAssembly.cs trunk/Source/StructureMap/Emitting/Parameters/Methods.cs trunk/Source/StructureMap/IInstanceFactory.cs trunk/Source/StructureMap/InstanceBuilder.cs trunk/Source/StructureMap/InstanceFactory.cs trunk/Source/StructureMap/Pipeline/BuildPolicy.cs trunk/Source/StructureMap/Pipeline/CacheInterceptor.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Building.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs trunk/Source/StructureMap/Pipeline/DefaultInstance.cs trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs trunk/Source/StructureMap/Pipeline/HybridBuildPolicy.cs trunk/Source/StructureMap/Pipeline/IBuildPolicy.cs trunk/Source/StructureMap/Pipeline/IConfiguredInstance.cs trunk/Source/StructureMap/Pipeline/ILocationPolicy.cs trunk/Source/StructureMap/Pipeline/Instance.cs trunk/Source/StructureMap/Pipeline/LiteralInstance.cs trunk/Source/StructureMap/Pipeline/PrototypeInstance.cs trunk/Source/StructureMap/Pipeline/ReferencedInstance.cs trunk/Source/StructureMap/Pipeline/SerializedInstance.cs trunk/Source/StructureMap/Pipeline/UserControlInstance.cs trunk/Source/StructureMap/StructureMap.csproj trunk/Source/StructureMap.Testing/BuildSessionTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/GenericFamilyExpressionTester.cs trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs trunk/Source/StructureMap.Testing/Pipeline/BuildStrategiesTester.cs trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/ConstructorInstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/DefaultInstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/InstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs trunk/Source/StructureMap.Testing/Pipeline/ReferencedInstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/StubBuildSession.cs trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj trunk/Source/StructureMap.Testing.Widget/ArrayConstruction.cs trunk/Source/StructureMap.Testing.Widget/BuilderSamples.cs trunk/Source/StructureMap.Testing.Widget/Decision.cs trunk/Source/StructureMap.Testing.Widget/Hierarchy.cs trunk/Source/StructureMap.Testing.Widget2/EnumerationCheck.cs trunk/Source/StructureMap.Testing.Widget5/BasicGridColumnInstanceBuilder.cs Added Paths: ----------- trunk/Source/StructureMap/Pipeline/BuildFrame.cs trunk/Source/StructureMap/Pipeline/BuildStack.cs trunk/Source/StructureMap.Testing/Pipeline/BuildStackTester.cs Removed Paths: ------------- trunk/Source/StructureMap/Pipeline/IBuildSession.cs trunk/Source/StructureMap/Source/ConfigInstanceMementoSource.cs trunk/Source/StructureMap/Source/EmbeddedMementoSource.cs Modified: trunk/Source/StructureMap/BuildSession.cs =================================================================== --- trunk/Source/StructureMap/BuildSession.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap/BuildSession.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -8,12 +8,13 @@ namespace StructureMap { - public class BuildSession : IBuildSession + public class BuildSession { private readonly InterceptorLibrary _interceptorLibrary; private readonly PipelineGraph _pipelineGraph; private readonly InstanceCache _cache = new InstanceCache(); private readonly Cache<Type, object> _defaults; + private readonly BuildStack _buildStack = new BuildStack(); public BuildSession(PipelineGraph pipelineGraph, InterceptorLibrary interceptorLibrary) { @@ -39,15 +40,18 @@ } + public BuildSession() : this(new PluginGraph()) + { + + } + protected PipelineGraph pipelineGraph { get { return _pipelineGraph; } } - #region IBuildSession Members - - public object CreateInstance(Type pluginType, string name) + public virtual object CreateInstance(Type pluginType, string name) { Instance instance = forType(pluginType).FindInstance(name); if (instance == null) @@ -65,13 +69,14 @@ if (result == null) { result = forType(pluginType).Build(this, instance); + _cache.Set(pluginType, instance, result); } return result; } - public Array CreateInstanceArray(Type pluginType, Instance[] instances) + public virtual Array CreateInstanceArray(Type pluginType, Instance[] instances) { Array array; @@ -99,23 +104,27 @@ return array; } - public object CreateInstance(Type pluginType) + public virtual object CreateInstance(Type pluginType) { return _defaults.Retrieve(pluginType); } - public object ApplyInterception(Type pluginType, object actualValue) + public virtual object ApplyInterception(Type pluginType, object actualValue) { return _interceptorLibrary.FindInterceptor(actualValue.GetType()).Process(actualValue); } - public void RegisterDefault(Type pluginType, object defaultObject) + public virtual void RegisterDefault(Type pluginType, object defaultObject) { _defaults.Store(pluginType, defaultObject); } - #endregion + public BuildStack BuildStack + { + get { return _buildStack; } + } + private IInstanceFactory forType(Type pluginType) { return _pipelineGraph.ForType(pluginType); Modified: trunk/Source/StructureMap/Container.cs =================================================================== --- trunk/Source/StructureMap/Container.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap/Container.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -90,7 +90,7 @@ Instance defaultInstance = _pipelineGraph.GetDefault(type); Instance instance = new ExplicitInstance(type, args, defaultInstance); - IBuildSession session = withNewSession(); + BuildSession session = withNewSession(); args.RegisterDefaults(session); @@ -123,7 +123,7 @@ { List<T> list = new List<T>(); - IBuildSession session = withNewSession(); + BuildSession session = withNewSession(); foreach (T instance in forType(typeof (T)).GetAllInstances(session)) { @@ -303,7 +303,7 @@ #endregion - private IBuildSession withNewSession() + private BuildSession withNewSession() { return new BuildSession(_pipelineGraph, _interceptorLibrary); } Modified: trunk/Source/StructureMap/Emitting/BuildInstanceMethod.cs =================================================================== --- trunk/Source/StructureMap/Emitting/BuildInstanceMethod.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap/Emitting/BuildInstanceMethod.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -21,7 +21,7 @@ public override Type[] ArgumentList { - get { return new Type[] {typeof (IConfiguredInstance), typeof (IBuildSession)}; } + get { return new Type[] {typeof (IConfiguredInstance), typeof (BuildSession)}; } } public override string MethodName Modified: trunk/Source/StructureMap/Emitting/DynamicAssembly.cs =================================================================== --- trunk/Source/StructureMap/Emitting/DynamicAssembly.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap/Emitting/DynamicAssembly.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -84,7 +84,7 @@ newClass.Bake(); } - _assemblyBuilder.Save(_name + ".dll"); + //_assemblyBuilder.Save(_name + ".dll"); //assemBuilder.Save(DLLName); //Assembly assem = AppDomain.CurrentDomain.Load(this.Name); Modified: trunk/Source/StructureMap/Emitting/Parameters/Methods.cs =================================================================== --- trunk/Source/StructureMap/Emitting/Parameters/Methods.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap/Emitting/Parameters/Methods.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -13,7 +13,7 @@ public static MethodInfo HAS_PROPERTY = ReflectionHelper.GetMethod<IConfiguredInstance>(i => i.HasProperty(null)); public static MethodInfo GET_CHILDREN_ARRAY = ReflectionHelper.GetMethod<IConfiguredInstance>(i => i.GetChildrenArray(null)); public static MethodInfo GET_CHILD = ReflectionHelper.GetMethod<IConfiguredInstance>(i => i.GetChild(null, null, null)); - public static MethodInfo CREATE_INSTANCE_ARRAY = ReflectionHelper.GetMethod<IBuildSession>(i => i.CreateInstanceArray(null, null)); + public static MethodInfo CREATE_INSTANCE_ARRAY = ReflectionHelper.GetMethod<BuildSession>(i => i.CreateInstanceArray(null, null)); public static MethodInfo GET_TYPE_FROM_HANDLE = typeof(Type).GetMethod("GetTypeFromHandle"); Modified: trunk/Source/StructureMap/IInstanceFactory.cs =================================================================== --- trunk/Source/StructureMap/IInstanceFactory.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap/IInstanceFactory.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -15,8 +15,8 @@ void AddInstance(Instance instance); Instance AddType<T>(); - IList GetAllInstances(IBuildSession session); - object Build(IBuildSession session, Instance instance); + IList GetAllInstances(BuildSession session); + object Build(BuildSession session, Instance instance); Instance FindInstance(string name); void ForEachInstance(Action<Instance> action); Modified: trunk/Source/StructureMap/InstanceBuilder.cs =================================================================== --- trunk/Source/StructureMap/InstanceBuilder.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap/InstanceBuilder.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -17,6 +17,6 @@ public abstract Type PluggedType { get; } - public abstract object BuildInstance(IConfiguredInstance instance, IBuildSession session); + public abstract object BuildInstance(IConfiguredInstance instance, BuildSession session); } } \ No newline at end of file Modified: trunk/Source/StructureMap/InstanceFactory.cs =================================================================== --- trunk/Source/StructureMap/InstanceFactory.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap/InstanceFactory.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -100,7 +100,7 @@ return instance; } - public IList GetAllInstances(IBuildSession session) + public IList GetAllInstances(BuildSession session) { IList list = new ArrayList(); @@ -113,7 +113,7 @@ return list; } - public object Build(IBuildSession session, Instance instance) + public object Build(BuildSession session, Instance instance) { return _policy.Build(session, PluginType, instance); } Added: trunk/Source/StructureMap/Pipeline/BuildFrame.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/BuildFrame.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/BuildFrame.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -0,0 +1,33 @@ +using System; + +namespace StructureMap.Pipeline +{ + public class BuildFrame + { + private readonly Type _requestedType; + private readonly string _name; + private readonly Type _concreteType; + + public BuildFrame(Type requestedType, string name, Type concreteType) + { + _requestedType = requestedType; + _name = name; + _concreteType = concreteType; + } + + public Type RequestedType + { + get { return _requestedType; } + } + + public string Name + { + get { return _name; } + } + + public Type ConcreteType + { + get { return _concreteType; } + } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/BuildPolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/BuildPolicy.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap/Pipeline/BuildPolicy.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -6,7 +6,7 @@ { #region IBuildPolicy Members - public object Build(IBuildSession buildSession, Type pluginType, Instance instance) + public object Build(BuildSession buildSession, Type pluginType, Instance instance) { if (buildSession == null) { Added: trunk/Source/StructureMap/Pipeline/BuildStack.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/BuildStack.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/BuildStack.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -0,0 +1,36 @@ +using System.Collections.Generic; + +namespace StructureMap.Pipeline +{ + public class BuildStack + { + private readonly Stack<BuildFrame> _frameStack = new Stack<BuildFrame>(); + private BuildFrame _root; + + internal BuildStack() + { + + } + + public BuildFrame Root + { + get { return _root; } + } + + public BuildFrame Current + { + get { return _frameStack.Peek(); } + } + + internal void Push(BuildFrame frame) + { + if (_root == null) _root = frame; + _frameStack.Push(frame); + } + + internal void Pop() + { + _frameStack.Pop(); + } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/CacheInterceptor.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/CacheInterceptor.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap/Pipeline/CacheInterceptor.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -16,7 +16,7 @@ } - public object Build(IBuildSession buildSession, Type pluginType, Instance instance) + public object Build(BuildSession buildSession, Type pluginType, Instance instance) { if (!isCached(instance.Name, pluginType)) { Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Building.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Building.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Building.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -26,14 +26,14 @@ return _properties[propertyName]; } - object IConfiguredInstance.GetChild(string propertyName, Type pluginType, IBuildSession buildSession) + object IConfiguredInstance.GetChild(string propertyName, Type pluginType, BuildSession buildSession) { return getChild(propertyName, pluginType, buildSession); } // Only open for testing - object IConfiguredInstance.Build(Type pluginType, IBuildSession session, InstanceBuilder builder) + object IConfiguredInstance.Build(Type pluginType, BuildSession session, InstanceBuilder builder) { if (builder == null) { @@ -64,5 +64,10 @@ { return _properties.ContainsKey(propertyName) || _children.ContainsKey(propertyName) || _arrays.ContainsKey(propertyName); } + + protected override Type getConcreteType() + { + return _pluggedType; + } } } Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -85,13 +85,13 @@ _arrays = instance._arrays; } - protected override object build(Type pluginType, IBuildSession session) + protected override object build(Type pluginType, BuildSession session) { InstanceBuilder builder = PluginCache.FindBuilder(_pluggedType); return ((IConfiguredInstance) this).Build(pluginType, session, builder); } - protected virtual object getChild(string propertyName, Type pluginType, IBuildSession buildSession) + protected virtual object getChild(string propertyName, Type pluginType, BuildSession buildSession) { Instance childInstance = _children.ContainsKey(propertyName) ? _children[propertyName] Modified: trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -24,7 +24,7 @@ get { return this; } } - protected override object build(Type pluginType, IBuildSession session) + protected override object build(Type pluginType, BuildSession session) { try { Modified: trunk/Source/StructureMap/Pipeline/DefaultInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/DefaultInstance.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap/Pipeline/DefaultInstance.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -9,7 +9,7 @@ int x = 1; } - protected override object build(Type pluginType, IBuildSession session) + protected override object build(Type pluginType, BuildSession session) { return session.CreateInstance(pluginType); } Modified: trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -63,7 +63,7 @@ return _args.ContainsKey(propertyName); } - public void RegisterDefaults(IBuildSession session) + public void RegisterDefaults(BuildSession session) { foreach (var pair in _children) { @@ -93,7 +93,7 @@ } - protected override object getChild(string propertyName, Type pluginType, IBuildSession buildSession) + protected override object getChild(string propertyName, Type pluginType, BuildSession buildSession) { if (_args.Has(pluginType)) { Modified: trunk/Source/StructureMap/Pipeline/HybridBuildPolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/HybridBuildPolicy.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap/Pipeline/HybridBuildPolicy.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -22,7 +22,7 @@ set { _innerInterceptor.InnerPolicy = value; } } - public object Build(IBuildSession buildSession, Type pluginType, Instance instance) + public object Build(BuildSession buildSession, Type pluginType, Instance instance) { return _innerInterceptor.Build(buildSession, pluginType, instance); } Modified: trunk/Source/StructureMap/Pipeline/IBuildPolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/IBuildPolicy.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap/Pipeline/IBuildPolicy.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -4,7 +4,7 @@ { public interface IBuildPolicy { - object Build(IBuildSession buildSession, Type pluginType, Instance instance); + object Build(BuildSession buildSession, Type pluginType, Instance instance); IBuildPolicy Clone(); } } \ No newline at end of file Deleted: trunk/Source/StructureMap/Pipeline/IBuildSession.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/IBuildSession.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap/Pipeline/IBuildSession.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -1,14 +0,0 @@ -using System; - -namespace StructureMap.Pipeline -{ - public interface IBuildSession - { - object CreateInstance(Type pluginType, string name); - object CreateInstance(Type pluginType, Instance instance); - Array CreateInstanceArray(Type pluginType, Instance[] instances); - object CreateInstance(Type pluginType); - object ApplyInterception(Type pluginType, object actualValue); - void RegisterDefault(Type pluginType, object defaultObject); - } -} \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/IConfiguredInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/IConfiguredInstance.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap/Pipeline/IConfiguredInstance.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -8,8 +8,8 @@ Type PluggedType { get; } Instance[] GetChildrenArray(string propertyName); string GetProperty(string propertyName); - object GetChild(string propertyName, Type pluginType, IBuildSession buildSession); - object Build(Type pluginType, IBuildSession session, InstanceBuilder builder); + object GetChild(string propertyName, Type pluginType, BuildSession buildSession); + object Build(Type pluginType, BuildSession session, InstanceBuilder builder); bool HasProperty(string propertyName); } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/ILocationPolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ILocationPolicy.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap/Pipeline/ILocationPolicy.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -2,7 +2,7 @@ { public interface ILocationPolicy { - object Build(IBuildSession session, Instance instance); + object Build(BuildSession session, Instance instance); } //public class DefaultPolicy : ILocationPolicy Modified: trunk/Source/StructureMap/Pipeline/Instance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/Instance.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap/Pipeline/Instance.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -14,6 +14,7 @@ InstanceToken CreateToken(); void Preprocess(PluginFamily family); void AddTemplatedInstanceTo(PluginFamily family, Type[] templateTypes); + Type ConcreteType { get; } } public abstract class Instance : IDiagnosticInstance @@ -34,13 +35,17 @@ set { _name = value; } } - public virtual object Build(Type pluginType, IBuildSession session) + public virtual object Build(Type pluginType, BuildSession session) { + session.BuildStack.Push(new BuildFrame(pluginType, Name, getConcreteType())); object rawValue = createRawObject(pluginType, session); - return applyInterception(rawValue, pluginType); + var finalValue = applyInterception(rawValue, pluginType); + session.BuildStack.Pop(); + + return finalValue; } - private object createRawObject(Type pluginType, IBuildSession session) + private object createRawObject(Type pluginType, BuildSession session) { try { @@ -91,6 +96,16 @@ addTemplatedInstanceTo(family, templateTypes); } + Type IDiagnosticInstance.ConcreteType + { + get { return getConcreteType(); } + } + + protected virtual Type getConcreteType() + { + return null; + } + protected virtual void addTemplatedInstanceTo(PluginFamily family, Type[] templateTypes) { if (canBePartOfPluginFamily(family)) @@ -131,7 +146,7 @@ } } - protected abstract object build(Type pluginType, IBuildSession session); + protected abstract object build(Type pluginType, BuildSession session); protected virtual Instance findMasterInstance(PluginFamily family, string profileName, GraphLog log) { Modified: trunk/Source/StructureMap/Pipeline/LiteralInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/LiteralInstance.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap/Pipeline/LiteralInstance.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -28,7 +28,7 @@ get { return _object; } } - protected override object build(Type pluginType, IBuildSession session) + protected override object build(Type pluginType, BuildSession session) { return _object; } Modified: trunk/Source/StructureMap/Pipeline/PrototypeInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/PrototypeInstance.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap/Pipeline/PrototypeInstance.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -19,7 +19,7 @@ } - protected override object build(Type pluginType, IBuildSession session) + protected override object build(Type pluginType, BuildSession session) { return _prototype.Clone(); } Modified: trunk/Source/StructureMap/Pipeline/ReferencedInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ReferencedInstance.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap/Pipeline/ReferencedInstance.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -35,7 +35,7 @@ #endregion - protected override object build(Type pluginType, IBuildSession session) + protected override object build(Type pluginType, BuildSession session) { return session.CreateInstance(pluginType, _referenceKey); } Modified: trunk/Source/StructureMap/Pipeline/SerializedInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/SerializedInstance.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap/Pipeline/SerializedInstance.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -24,7 +24,7 @@ return "Serialized instance"; } - protected override object build(Type pluginType, IBuildSession session) + protected override object build(Type pluginType, BuildSession session) { lock (_locker) { Modified: trunk/Source/StructureMap/Pipeline/UserControlInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/UserControlInstance.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap/Pipeline/UserControlInstance.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -24,7 +24,7 @@ get { return _url; } } - protected override object build(Type pluginType, IBuildSession session) + protected override object build(Type pluginType, BuildSession session) { Control control = new Page().LoadControl(_url); Deleted: trunk/Source/StructureMap/Source/ConfigInstanceMementoSource.cs =================================================================== --- trunk/Source/StructureMap/Source/ConfigInstanceMementoSource.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap/Source/ConfigInstanceMementoSource.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -1,61 +0,0 @@ -using System; -using System.Xml; - -namespace StructureMap.Source -{ - /// <summary> - /// MementoSource that reads InstanceMemento's from the <Instances> node - /// in the StructureMap.config file - /// </summary> - [Obsolete("No longer used")] - public class ConfigInstanceMementoSource : XmlMementoSource - { - private XmlNode _root; - - public ConfigInstanceMementoSource(Type pluginType) - : base(pluginType.FullName, "Type", "Key", XmlMementoStyle.NodeNormalized) - { - initializeToDefaultConfigFile(); - } - - private void initializeToDefaultConfigFile() - { - XmlDocument doc = new XmlDocument(); - string fileName = PluginGraphBuilder.GetStructureMapConfigurationPath(); - doc.Load(fileName); - - _root = doc.DocumentElement.SelectSingleNode("Instances"); - } - - public ConfigInstanceMementoSource(Type pluginType, XmlNode StructureMapNode) - : base(pluginType.FullName, "Type", "Key", XmlMementoStyle.NodeNormalized) - { - if (StructureMapNode == null) - { - initializeToDefaultConfigFile(); - } - else - { - _root = StructureMapNode.SelectSingleNode("Instances"); - } - } - - - protected override XmlNode getRootNode() - { - return _root; - } - - public override MementoSourceType SourceType - { - get { return MementoSourceType.ConfigInstance; } - } - - public override string Description - { - get { return "ConfigInstanceMementoSource"; } - } - - - } -} \ No newline at end of file Deleted: trunk/Source/StructureMap/Source/EmbeddedMementoSource.cs =================================================================== --- trunk/Source/StructureMap/Source/EmbeddedMementoSource.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap/Source/EmbeddedMementoSource.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -1,25 +0,0 @@ -using System; -using System.Xml; - -namespace StructureMap.Source -{ - [Obsolete("No longer used within core of StructureMap")] - public class EmbeddedMementoSource : BasicXmlMementoSource - { - public EmbeddedMementoSource(XmlNode Node) - : base(Node, "Instance") - { - } - - public override MementoSourceType SourceType - { - get { return MementoSourceType.Embedded; } - } - - public override string Description - { - get { return "EmbeddedMementoSource"; } - } - - } -} \ No newline at end of file Modified: trunk/Source/StructureMap/StructureMap.csproj =================================================================== --- trunk/Source/StructureMap/StructureMap.csproj 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap/StructureMap.csproj 2008-08-16 16:44:23 UTC (rev 139) @@ -173,7 +173,6 @@ <Compile Include="Pipeline\HybridBuildPolicy.cs" /> <Compile Include="Pipeline\IBuildInterceptor.cs" /> <Compile Include="Pipeline\IBuildPolicy.cs" /> - <Compile Include="Pipeline\IBuildSession.cs" /> <Compile Include="Pipeline\IConfiguredInstance.cs" /> <Compile Include="Pipeline\ILocationPolicy.cs" /> <Compile Include="Pipeline\Instance.cs" /> @@ -405,6 +404,8 @@ <Compile Include="Graph\ITypeScanner.cs" /> <Compile Include="Graph\PluginCache.cs" /> <Compile Include="IBootstrapper.cs" /> + <Compile Include="Pipeline\BuildFrame.cs" /> + <Compile Include="Pipeline\BuildStack.cs" /> <Compile Include="Pipeline\ConfiguredInstance.Building.cs" /> <Compile Include="Pipeline\IStructuredInstance.cs" /> <Compile Include="Pipeline\SerializedInstance.cs" /> Modified: trunk/Source/StructureMap.Testing/BuildSessionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/BuildSessionTester.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap.Testing/BuildSessionTester.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -164,5 +164,58 @@ session.CreateInstance(typeof (IGateway)); }); } + + + [Test] + public void when_building_an_instance_use_the_register_the_stack_frame() + { + var recordingInstance = new BuildSessionInstance1(); + ConfiguredInstance instance = new ConfiguredInstance(typeof(ClassWithRule)).Child("rule").Is(recordingInstance); + BuildSession session = new BuildSession(new PluginGraph()); + + 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.Current.ConcreteType.ShouldEqual(typeof(ColorRule)); + recordingInstance.Current.RequestedType.ShouldEqual(typeof(Rule)); + recordingInstance.Current.Name.ShouldEqual(recordingInstance.Name); + } } + + public interface IClassWithRule{} + + public class ClassWithRule : IClassWithRule + { + public ClassWithRule(Rule rule) + { + + } + } + + public class BuildSessionInstance1 : Instance + { + public BuildFrame Current { get; set; } + public BuildFrame Root { get; set; } + + protected override string getDescription() + { + return string.Empty; + } + + protected override Type getConcreteType() + { + return typeof(ColorRule); + } + + protected override object build(Type pluginType, BuildSession session) + { + Current = session.BuildStack.Current; + Root = session.BuildStack.Root; + + return new ColorRule("Red"); + } + } } \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -253,7 +253,7 @@ set { } } - public object Build(IBuildSession buildSession, Type pluginType, Instance instance) + public object Build(BuildSession buildSession, Type pluginType, Instance instance) { throw new NotImplementedException(); } Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/GenericFamilyExpressionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/GenericFamilyExpressionTester.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/GenericFamilyExpressionTester.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -51,7 +51,7 @@ set { } } - public object Build(IBuildSession buildSession, Type pluginType, Instance instance) + public object Build(BuildSession buildSession, Type pluginType, Instance instance) { throw new NotImplementedException(); } Modified: trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -260,7 +260,7 @@ set { throw new NotImplementedException(); } } - public object Build(IBuildSession buildSession, Type pluginType, Instance instance) + public object Build(BuildSession buildSession, Type pluginType, Instance instance) { throw new NotImplementedException(); } Added: trunk/Source/StructureMap.Testing/Pipeline/BuildStackTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/BuildStackTester.cs (rev 0) +++ trunk/Source/StructureMap.Testing/Pipeline/BuildStackTester.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -0,0 +1,44 @@ +using NUnit.Framework; +using StructureMap.Pipeline; +using StructureMap.Testing.Widget; +using StructureMap.Testing.Widget3; + +namespace StructureMap.Testing.Pipeline +{ + [TestFixture] + public class BuildStackTester + { + [Test] + public void Create_build_stack_and_the_root_is_from_the_ctor() + { + var root = new BuildFrame(typeof(IWidget), "Blue", typeof(ColorWidget)); + BuildStack stack = new BuildStack(); + stack.Push(root); + + stack.Root.ShouldBeTheSameAs(root); + } + + [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)); + BuildStack stack = new BuildStack(); + stack.Push(root); + + stack.Push(frame1); + stack.Current.ShouldBeTheSameAs(frame1); + stack.Root.ShouldBeTheSameAs(root); + + stack.Push(frame2); + stack.Current.ShouldBeTheSameAs(frame2); + stack.Root.ShouldBeTheSameAs(root); + + stack.Pop(); + stack.Current.ShouldBeTheSameAs(frame1); + stack.Pop(); + stack.Current.ShouldBeTheSameAs(root); + } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Pipeline/BuildStrategiesTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/BuildStrategiesTester.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap.Testing/Pipeline/BuildStrategiesTester.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -28,7 +28,7 @@ _constructedObject = constructedObject; } - protected override object build(Type pluginType, IBuildSession session) + protected override object build(Type pluginType, BuildSession session) { return _constructedObject; } @@ -43,7 +43,7 @@ public void BuildPolicy_should_apply_interception() { MockRepository mocks = new MockRepository(); - IBuildSession buildSession = mocks.CreateMock<IBuildSession>(); + BuildSession buildSession = mocks.CreateMock<BuildSession>(); object firstValue = "first"; object secondValue = "second"; Modified: trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -32,7 +32,7 @@ #endregion - private IBuildSession _session; + private BuildSession _session; private void assertActionThrowsErrorCode(int errorCode, Action action) @@ -49,13 +49,20 @@ } } + [Test] + public void get_the_concrete_type_from_diagnostic_instance() + { + var instance = new ConfiguredInstance(typeof (ColorRule)) as IDiagnosticInstance; + instance.ConcreteType.ShouldEqual(typeof (ColorRule)); + } + [Test] public void Build_happy_path() { MockRepository mocks = new MockRepository(); InstanceBuilder builder = mocks.CreateMock<InstanceBuilder>(); - IBuildSession session = mocks.CreateMock<IBuildSession>(); + BuildSession session = mocks.CreateMock<BuildSession>(); object theObjectBuilt = new object(); ConfiguredInstance instance = new ConfiguredInstance(GetType()); @@ -173,7 +180,7 @@ public void Should_find_the_InstanceBuilder_by_PluggedType_if_it_exists() { MockRepository mocks = new MockRepository(); - IBuildSession session = mocks.DynamicMock<IBuildSession>(); + BuildSession session = mocks.DynamicMock<BuildSession>(); Type thePluginType = typeof (IGateway); Type thePluggedType = GetType(); Modified: trunk/Source/StructureMap.Testing/Pipeline/ConstructorInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/ConstructorInstanceTester.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap.Testing/Pipeline/ConstructorInstanceTester.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -15,7 +15,7 @@ try { - instance.Build(typeof (IWidget), null); + instance.Build(typeof (IWidget), new StubBuildSession()); Assert.Fail("Should have thrown an exception"); } catch (StructureMapException ex) Modified: trunk/Source/StructureMap.Testing/Pipeline/DefaultInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/DefaultInstanceTester.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap.Testing/Pipeline/DefaultInstanceTester.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -28,8 +28,8 @@ public void Build_happy_path() { MockRepository mocks = new MockRepository(); - IBuildSession buildSession = - mocks.CreateMock<IBuildSession>(); + BuildSession buildSession = + mocks.CreateMock<BuildSession>(); DefaultClass theDefault = new DefaultClass(); Modified: trunk/Source/StructureMap.Testing/Pipeline/InstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/InstanceTester.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap.Testing/Pipeline/InstanceTester.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -37,7 +37,7 @@ { MockRepository mocks = new MockRepository(); InstanceInterceptor interceptor = mocks.CreateMock<InstanceInterceptor>(); - IBuildSession buildSession = mocks.CreateMock<IBuildSession>(); + BuildSession buildSession = mocks.CreateMock<BuildSession>(); InstanceUnderTest instanceUnderTest = new InstanceUnderTest(); @@ -63,7 +63,7 @@ public object TheInstanceThatWasBuilt = new object(); - protected override object build(Type pluginType, IBuildSession session) + protected override object build(Type pluginType, BuildSession session) { return TheInstanceThatWasBuilt; } Modified: trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -4,6 +4,7 @@ using System.Linq.Expressions; using NUnit.Framework; using StructureMap.Configuration.DSL; +using StructureMap.Graph; using StructureMap.Pipeline; using StructureMap.Testing.TestData; using StructureMap.Testing.Widget; @@ -17,7 +18,7 @@ get { throw new System.NotImplementedException(); } } - public override object BuildInstance(IConfiguredInstance instance, IBuildSession session) + public override object BuildInstance(IConfiguredInstance instance, BuildSession session) { ClassWithOneSetter target = new ClassWithOneSetter(); if (instance.HasProperty("Name")) target.Name = instance.GetProperty("Name"); @@ -30,6 +31,12 @@ [TestFixture] public class OptionalSetterInjectionTester : RegistryExpressions { + [SetUp] + public void SetUp() + { + PluginCache.ResetAll(); + } + [Test] public void optional_setter_injection_with_string() { @@ -267,7 +274,7 @@ get { throw new System.NotImplementedException(); } } - public override object BuildInstance(IConfiguredInstance instance, IBuildSession session) + public override object BuildInstance(IConfiguredInstance instance, BuildSession session) { ClassWithOneEnum target = new ClassWithOneEnum(); if (instance.HasProperty("Color")) target.Color = (ColorEnum) Enum.Parse(typeof (ColorEnum), instance.GetProperty("Color")); Modified: trunk/Source/StructureMap.Testing/Pipeline/ReferencedInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/ReferencedInstanceTester.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap.Testing/Pipeline/ReferencedInstanceTester.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -30,7 +30,7 @@ public void Create_referenced_instance_happy_path() { MockRepository mocks = new MockRepository(); - IBuildSession buildSession = mocks.CreateMock<IBuildSession>(); + BuildSession buildSession = mocks.CreateMock<BuildSession>(); ConcreteReferenced returnedValue = new ConcreteReferenced(); string theReferenceKey = "theReferenceKey"; Modified: trunk/Source/StructureMap.Testing/Pipeline/StubBuildSession.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/StubBuildSession.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap.Testing/Pipeline/StubBuildSession.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -1,35 +1,20 @@ using System; using StructureMap.Graph; using StructureMap.Pipeline; +using StructureMap.Testing.Widget; namespace StructureMap.Testing.Pipeline { - public class StubBuildSession : IBuildSession + public class StubBuildSession : BuildSession { - #region IBuildSession Members + #region BuildSession Members - public object CreateInstance(Type type, string name) + public StubBuildSession() : base(new PluginGraph()) { - throw new NotImplementedException(); } - public object CreateInstance(Type pluginType, Instance instance) + public override object ApplyInterception(Type pluginType, object actualValue) { - throw new NotImplementedException(); - } - - public Array CreateInstanceArray(Type pluginType, Instance[] instances) - { - throw new NotImplementedException(); - } - - public object CreateInstance(Type pluginType) - { - throw new NotImplementedException(); - } - - public object ApplyInterception(Type pluginType, object actualValue) - { return actualValue; } @@ -54,6 +39,16 @@ } + public BuildStack BuildStack + { + get + { + var stack = new BuildStack(); + stack.Push(new BuildFrame(typeof(Rule), "Blue", typeof(ColorRule))); + return stack; + } + } + #endregion public object CreateInstance(string typeName, IConfiguredInstance instance) Modified: trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj =================================================================== --- trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2008-08-16 16:44:23 UTC (rev 139) @@ -356,6 +356,7 @@ <SubType>Code</SubType> </Compile> <Compile Include="PipelineGraphTester.cs" /> + <Compile Include="Pipeline\BuildStackTester.cs" /> <Compile Include="Pipeline\BuildStrategiesTester.cs" /> <Compile Include="Pipeline\ConfiguredInstanceTester.cs" /> <Compile Include="Pipeline\ConstructorInstanceTester.cs" /> Modified: trunk/Source/StructureMap.Testing.Widget/ArrayConstruction.cs =================================================================== --- trunk/Source/StructureMap.Testing.Widget/ArrayConstruction.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap.Testing.Widget/ArrayConstruction.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -51,7 +51,7 @@ public class StringListBuilder : InstanceBuilder { - public override object BuildInstance(IConfiguredInstance instance, StructureMap.Pipeline.IBuildSession session) + public override object BuildInstance(IConfiguredInstance instance, BuildSession session) { return null; } Modified: trunk/Source/StructureMap.Testing.Widget/BuilderSamples.cs =================================================================== --- trunk/Source/StructureMap.Testing.Widget/BuilderSamples.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap.Testing.Widget/BuilderSamples.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -28,7 +28,7 @@ get { throw new System.NotImplementedException(); } } - public override object BuildInstance(IConfiguredInstance instance, IBuildSession session) + public override object BuildInstance(IConfiguredInstance instance, BuildSession session) { SetterTarget target = new SetterTarget(); return target; @@ -42,7 +42,7 @@ get { throw new System.NotImplementedException(); } } - public override object BuildInstance(IConfiguredInstance instance, IBuildSession session) + public override object BuildInstance(IConfiguredInstance instance, BuildSession session) { SetterTarget target = new SetterTarget(); if (instance.HasProperty("Name")) target.Name = instance.GetProperty("Name"); @@ -57,7 +57,7 @@ get { throw new System.NotImplementedException(); } } - public override object BuildInstance(IConfiguredInstance instance, IBuildSession session) + public override object BuildInstance(IConfiguredInstance instance, BuildSession session) { SetterTarget target = new SetterTarget(); if (instance.HasProperty("Name")) target.Name = instance.GetProperty("Name"); Modified: trunk/Source/StructureMap.Testing.Widget/Decision.cs =================================================================== --- trunk/Source/StructureMap.Testing.Widget/Decision.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap.Testing.Widget/Decision.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -17,7 +17,7 @@ public class DecisionBuilder : InstanceBuilder { - public override object BuildInstance(IConfiguredInstance instance, StructureMap.Pipeline.IBuildSession session) + public override object BuildInstance(IConfiguredInstance instance, BuildSession session) { return new Decision( (Rule[]) session.CreateInstanceArray(typeof(Rule), instance.GetChildrenArray("Rules"))); Modified: trunk/Source/StructureMap.Testing.Widget/Hierarchy.cs =================================================================== --- trunk/Source/StructureMap.Testing.Widget/Hierarchy.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap.Testing.Widget/Hierarchy.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -98,7 +98,7 @@ } - public override object BuildInstance(IConfiguredInstance instance, StructureMap.Pipeline.IBuildSession session) + public override object BuildInstance(IConfiguredInstance instance, BuildSession session) { var target = new Child( instance.GetProperty("Name"), Modified: trunk/Source/StructureMap.Testing.Widget2/EnumerationCheck.cs =================================================================== --- trunk/Source/StructureMap.Testing.Widget2/EnumerationCheck.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap.Testing.Widget2/EnumerationCheck.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -42,7 +42,7 @@ } - public override object BuildInstance(IConfiguredInstance instance, StructureMap.Pipeline.IBuildSession session) + public override object BuildInstance(IConfiguredInstance instance, BuildSession session) { return new Cow( long.Parse(instance.GetProperty("Weight")), @@ -58,7 +58,7 @@ get { throw new System.NotImplementedException(); } } - public override object BuildInstance(IConfiguredInstance instance, IBuildSession session) + public override object BuildInstance(IConfiguredInstance instance, BuildSession session) { SetterTarget target = new SetterTarget(); Modified: trunk/Source/StructureMap.Testing.Widget5/BasicGridColumnInstanceBuilder.cs =================================================================== --- trunk/Source/StructureMap.Testing.Widget5/BasicGridColumnInstanceBuilder.cs 2008-08-13 21:51:26 UTC (rev 138) +++ trunk/Source/StructureMap.Testing.Widget5/BasicGridColumnInstanceBuilder.cs 2008-08-16 16:44:23 UTC (rev 139) @@ -18,7 +18,7 @@ get { throw new NotImplementedException(); } } - public override object BuildInstance(IConfiguredInstance instance, StructureMap.Pipeline.IBuildSession session) + public override object BuildInstance(IConfiguredInstance instance, BuildSession session) { BasicGridColumn column = new BasicGridColumn(instance.GetProperty("headerText")); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2008-08-19 01:24:42
|
Revision: 140 http://structuremap.svn.sourceforge.net/structuremap/?rev=140&view=rev Author: jeremydmiller Date: 2008-08-19 01:24:37 +0000 (Tue, 19 Aug 2008) Log Message: ----------- refactored ConfiguredInstance Modified Paths: -------------- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs trunk/Source/StructureMap/Configuration/DSL/Registry.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs trunk/Source/StructureMap/Pipeline/IConfiguredInstance.cs trunk/Source/StructureMap/Pipeline/InstanceMementoPropertyReader.cs trunk/Source/StructureMap/StructureMap.csproj trunk/Source/StructureMap.Testing/Graph/ContainerTester.cs trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs trunk/Source/StructureMap.Testing.Widget/Rule.cs Added Paths: ----------- trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs Removed Paths: ------------- trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Building.cs Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2008-08-16 16:44:23 UTC (rev 139) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2008-08-19 01:24:37 UTC (rev 140) @@ -146,11 +146,13 @@ return this; } + [Obsolete("Kill!")] public CreatePluginFamilyExpression<PLUGINTYPE> AddConcreteType<CONCRETETYPE>() { return AddConcreteType<CONCRETETYPE>(Guid.NewGuid().ToString()); } + [Obsolete("Kill!")] public CreatePluginFamilyExpression<PLUGINTYPE> AddConcreteType<CONCRETETYPE>(string instanceName) { ExpressionValidator.ValidatePluggabilityOf(typeof (CONCRETETYPE)).IntoPluginType(typeof (PLUGINTYPE)); @@ -179,23 +181,27 @@ return this; } + [Obsolete("Kill!")] public CreatePluginFamilyExpression<PLUGINTYPE> TheDefaultIs(PLUGINTYPE @object) { return TheDefaultIs(new LiteralInstance(@object)); } + [Obsolete("Kill!")] public CreatePluginFamilyExpression<PLUGINTYPE> TheDefaultIs(Func<PLUGINTYPE> func) { ConstructorInstance instance = new ConstructorInstance(() => func()); return TheDefaultIs(instance); } + [Obsolete("Kill!")] public CreatePluginFamilyExpression<PLUGINTYPE> AddInstance(PLUGINTYPE @object) { LiteralInstance instance = new LiteralInstance(@object); return AddInstance(instance); } + [Obsolete("Kill!")] public CreatePluginFamilyExpression<PLUGINTYPE> AddInstance(Func<PLUGINTYPE> func) { ConstructorInstance instance = new ConstructorInstance(() => func()); Modified: trunk/Source/StructureMap/Configuration/DSL/Registry.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2008-08-16 16:44:23 UTC (rev 139) +++ trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2008-08-19 01:24:37 UTC (rev 140) @@ -88,11 +88,13 @@ /// </summary> /// <typeparam name="PLUGINTYPE"></typeparam> /// <returns></returns> + [Obsolete("Like to go away")] public ConfiguredInstanceExpression<PLUGINTYPE> AddInstanceOf<PLUGINTYPE>() { return new ConfiguredInstanceExpression<PLUGINTYPE>(this); } + [Obsolete("Like to get rid of this")] public class ConfiguredInstanceExpression<PLUGINTYPE> { private readonly Registry _registry; @@ -102,15 +104,7 @@ _registry = registry; } - /* - ConfiguredInstance instance = new ConfiguredInstance(); - addExpression( - pluginGraph => pluginGraph.FindFamily(typeof (PLUGINTYPE)).AddInstance(instance)); - - return instance; - */ - public ConfiguredInstance UsingConcreteType<T>() { ConfiguredInstance instance = new ConfiguredInstance(typeof(T)); @@ -127,6 +121,7 @@ /// <typeparam name="PLUGINTYPE"></typeparam> /// <param name="target"></param> /// <returns></returns> + [Obsolete("Like to get rid of this")] public LiteralInstance AddInstanceOf<PLUGINTYPE>(PLUGINTYPE target) { LiteralInstance literal = new LiteralInstance(target); @@ -141,6 +136,7 @@ /// <typeparam name="PLUGINTYPE"></typeparam> /// <param name="prototype"></param> /// <returns></returns> + [Obsolete("Like to get rid of this")] public PrototypeInstance AddPrototypeInstanceOf<PLUGINTYPE>(PLUGINTYPE prototype) { PrototypeInstance instance = new PrototypeInstance((ICloneable) prototype); @@ -154,6 +150,7 @@ /// </summary> /// <param name="url"></param> /// <returns></returns> + [Obsolete("Like to get rid of this")] public static UserControlInstance LoadUserControlFrom(string url) { return new UserControlInstance(url); @@ -209,12 +206,13 @@ return new ScanAssembliesExpression(this); } - + [Obsolete("Like to get rid of this")] public void AddInstanceOf(Type pluginType, Instance instance) { _actions.Add(graph => graph.FindFamily(pluginType).AddInstance(instance)); } + [Obsolete("Like to get rid of this")] public void AddInstanceOf<PLUGINTYPE>(Instance instance) { _actions.Add(graph => graph.FindFamily(typeof (PLUGINTYPE)).AddInstance(instance)); Deleted: trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Building.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Building.cs 2008-08-16 16:44:23 UTC (rev 139) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Building.cs 2008-08-19 01:24:37 UTC (rev 140) @@ -1,73 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace StructureMap.Pipeline -{ - public partial class ConfiguredInstance - { - Type IConfiguredInstance.PluggedType - { - get { return _pluggedType; } - } - - Instance[] IConfiguredInstance.GetChildrenArray(string propertyName) - { - return _arrays.ContainsKey(propertyName) ? _arrays[propertyName] : null; - } - - string IConfiguredInstance.GetProperty(string propertyName) - { - if (!_properties.ContainsKey(propertyName)) - { - throw new StructureMapException(205, propertyName, Name); - } - - return _properties[propertyName]; - } - - object IConfiguredInstance.GetChild(string propertyName, Type pluginType, BuildSession buildSession) - { - return getChild(propertyName, pluginType, buildSession); - } - - - // Only open for testing - object IConfiguredInstance.Build(Type pluginType, BuildSession session, InstanceBuilder builder) - { - if (builder == null) - { - throw new StructureMapException( - 201, _pluggedType.FullName, Name, pluginType); - } - - - try - { - return builder.BuildInstance(this, session); - } - catch (StructureMapException) - { - throw; - } - catch (InvalidCastException ex) - { - throw new StructureMapException(206, ex, Name); - } - catch (Exception ex) - { - throw new StructureMapException(207, ex, Name, pluginType.FullName); - } - } - - bool IConfiguredInstance.HasProperty(string propertyName) - { - return _properties.ContainsKey(propertyName) || _children.ContainsKey(propertyName) || _arrays.ContainsKey(propertyName); - } - - protected override Type getConcreteType() - { - return _pluggedType; - } - } -} Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs 2008-08-16 16:44:23 UTC (rev 139) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs 2008-08-19 01:24:37 UTC (rev 140) @@ -77,28 +77,6 @@ return new PropertyExpression(this, propertyName); } - - private string findPropertyName<T>() - { - Plugin plugin = new Plugin(_pluggedType); - string propertyName = plugin.FindArgumentNameForType<T>(); - - if (string.IsNullOrEmpty(propertyName)) - { - throw new StructureMapException(305, typeof (T)); - } - - return propertyName; - } - - private static void validateTypeIsArray<PLUGINTYPE>() - { - if (!typeof (PLUGINTYPE).IsArray) - { - throw new StructureMapException(307); - } - } - #region Nested type: ChildArrayExpression public class ChildArrayExpression @@ -236,7 +214,7 @@ /// <returns></returns> public ConfiguredInstance EqualTo(object propertyValue) { - _instance.SetProperty(_propertyName, propertyValue.ToString()); + _instance.setProperty(_propertyName, propertyValue.ToString()); return _instance; } @@ -249,7 +227,7 @@ public ConfiguredInstance EqualToAppSetting(string appSettingKey) { string propertyValue = ConfigurationManager.AppSettings[appSettingKey]; - _instance.SetProperty(_propertyName, propertyValue); + _instance.setProperty(_propertyName, propertyValue); return _instance; } } Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs 2008-08-16 16:44:23 UTC (rev 139) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs 2008-08-19 01:24:37 UTC (rev 140) @@ -4,31 +4,19 @@ namespace StructureMap.Pipeline { - public partial class ConfiguredInstance : ExpressedInstance<ConfiguredInstance>, IConfiguredInstance, - IStructuredInstance + public partial class ConfiguredInstance : ConfiguredInstanceBase<ConfiguredInstance> { - private Dictionary<string, Instance> _children = new Dictionary<string, Instance>(); - private Dictionary<string, string> _properties = new Dictionary<string, string>(); - private Dictionary<string, Instance[]> _arrays = new Dictionary<string, Instance[]>(); - - private Type _pluggedType; - - - public ConfiguredInstance(InstanceMemento memento, PluginGraph graph, Type pluginType) + public ConfiguredInstance(InstanceMemento memento, PluginGraph graph, Type pluginType) : base(memento, graph, pluginType) { - read(memento, graph, pluginType); } - public ConfiguredInstance(Type pluggedType, string name) + public ConfiguredInstance(Type pluggedType, string name) : base(pluggedType, name) { - _pluggedType = pluggedType; - Name = name; } - public ConfiguredInstance(Type pluggedType) + public ConfiguredInstance(Type pluggedType) : base(pluggedType) { - _pluggedType = pluggedType; } @@ -39,21 +27,6 @@ #region IStructuredInstance Members - Instance IStructuredInstance.GetChild(string name) - { - return _children[name]; - } - - Instance[] IStructuredInstance.GetChildArray(string name) - { - return _arrays[name]; - } - - void IStructuredInstance.RemoveKey(string name) - { - _properties.Remove(name); - } - #endregion protected void setPluggedType(Type pluggedType) @@ -85,64 +58,7 @@ _arrays = instance._arrays; } - protected override object build(Type pluginType, BuildSession session) - { - InstanceBuilder builder = PluginCache.FindBuilder(_pluggedType); - return ((IConfiguredInstance) this).Build(pluginType, session, builder); - } - protected virtual object getChild(string propertyName, Type pluginType, BuildSession buildSession) - { - Instance childInstance = _children.ContainsKey(propertyName) - ? _children[propertyName] - : new DefaultInstance(); - - - return childInstance.Build(pluginType, buildSession); - } - - - protected override bool canBePartOfPluginFamily(PluginFamily family) - { - return TypeRules.CanBeCast(family.PluginType, _pluggedType); - } - - internal override bool Matches(Plugin plugin) - { - return plugin.PluggedType == _pluggedType; - } - - public ConfiguredInstance SetProperty(string propertyName, string propertyValue) - { - _properties[propertyName] = propertyValue; - return this; - } - - private void read(InstanceMemento memento, PluginGraph graph, Type pluginType) - { - PluginFamily family = graph.FindFamily(pluginType); - Plugin plugin = memento.FindPlugin(family); - - _pluggedType = plugin.PluggedType; - - InstanceMementoPropertyReader reader = new InstanceMementoPropertyReader(this, memento, graph, pluginType); - plugin.VisitArguments(reader); - } - - - private void setChild(string name, Instance instance) - { - if (instance == null) return; - - _children.Add(name, instance); - } - - private void setChildArray(string name, Instance[] array) - { - _arrays.Add(name, array); - } - - protected override void preprocess(PluginFamily family) { Added: trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs 2008-08-19 01:24:37 UTC (rev 140) @@ -0,0 +1,198 @@ +using System; +using System.Collections.Generic; +using StructureMap.Graph; + +namespace StructureMap.Pipeline +{ + public abstract class ConfiguredInstanceBase<T> : ExpressedInstance<T>, IConfiguredInstance, IStructuredInstance + { + protected Dictionary<string, Instance> _children = new Dictionary<string, Instance>(); + protected Dictionary<string, string> _properties = new Dictionary<string, string>(); + protected Dictionary<string, Instance[]> _arrays = new Dictionary<string, Instance[]>(); + protected Type _pluggedType; + + protected ConfiguredInstanceBase(InstanceMemento memento, PluginGraph graph, Type pluginType) + { + read(memento, graph, pluginType); + } + + protected ConfiguredInstanceBase(Type pluggedType, string name) + { + _pluggedType = pluggedType; + Name = name; + } + + protected ConfiguredInstanceBase(Type pluggedType) + { + _pluggedType = pluggedType; + } + + + Type IConfiguredInstance.PluggedType + { + get { return _pluggedType; } + } + + Instance IStructuredInstance.GetChild(string name) + { + return _children[name]; + } + + Instance[] IStructuredInstance.GetChildArray(string name) + { + return _arrays[name]; + } + + void IStructuredInstance.RemoveKey(string name) + { + _properties.Remove(name); + } + + protected override object build(Type pluginType, BuildSession session) + { + InstanceBuilder builder = PluginCache.FindBuilder(_pluggedType); + return ((IConfiguredInstance) this).Build(pluginType, session, builder); + } + + protected virtual object getChild(string propertyName, Type pluginType, BuildSession buildSession) + { + Instance childInstance = _children.ContainsKey(propertyName) + ? _children[propertyName] + : new DefaultInstance(); + + + return childInstance.Build(pluginType, buildSession); + } + + protected override bool canBePartOfPluginFamily(PluginFamily family) + { + return TypeRules.CanBeCast(family.PluginType, _pluggedType); + } + + internal override bool Matches(Plugin plugin) + { + return plugin.PluggedType == _pluggedType; + } + + private void read(InstanceMemento memento, PluginGraph graph, Type pluginType) + { + PluginFamily family = graph.FindFamily(pluginType); + Plugin plugin = memento.FindPlugin(family); + + _pluggedType = plugin.PluggedType; + + InstanceMementoPropertyReader reader = new InstanceMementoPropertyReader(this, memento, graph, pluginType); + plugin.VisitArguments(reader); + } + + protected void setChild(string name, Instance instance) + { + if (instance == null) return; + + _children.Add(name, instance); + } + + protected void setChildArray(string name, Instance[] array) + { + _arrays.Add(name, array); + } + + Instance[] IConfiguredInstance.GetChildrenArray(string propertyName) + { + return _arrays.ContainsKey(propertyName) ? _arrays[propertyName] : null; + } + + string IConfiguredInstance.GetProperty(string propertyName) + { + if (!_properties.ContainsKey(propertyName)) + { + throw new StructureMapException(205, propertyName, Name); + } + + return _properties[propertyName]; + } + + object IConfiguredInstance.GetChild(string propertyName, Type pluginType, BuildSession buildSession) + { + return getChild(propertyName, pluginType, buildSession); + } + + object IConfiguredInstance.Build(Type pluginType, BuildSession session, InstanceBuilder builder) + { + if (builder == null) + { + throw new StructureMapException( + 201, _pluggedType.FullName, Name, pluginType); + } + + + try + { + return builder.BuildInstance(this, session); + } + catch (StructureMapException) + { + throw; + } + catch (InvalidCastException ex) + { + throw new StructureMapException(206, ex, Name); + } + catch (Exception ex) + { + throw new StructureMapException(207, ex, Name, pluginType.FullName); + } + } + + bool IConfiguredInstance.HasProperty(string propertyName) + { + return _properties.ContainsKey(propertyName) || _children.ContainsKey(propertyName) || _arrays.ContainsKey(propertyName); + } + + protected override Type getConcreteType() + { + return _pluggedType; + } + + protected string findPropertyName<T>() + { + Plugin plugin = new Plugin(_pluggedType); + string propertyName = plugin.FindArgumentNameForType<T>(); + + if (string.IsNullOrEmpty(propertyName)) + { + throw new StructureMapException(305, typeof (T)); + } + + return propertyName; + } + + protected static void validateTypeIsArray<PLUGINTYPE>() + { + if (!typeof (PLUGINTYPE).IsArray) + { + throw new StructureMapException(307); + } + } + + void IConfiguredInstance.SetProperty(string propertyName, string propertyValue) + { + setProperty(propertyName, propertyValue); + } + + protected void setProperty(string propertyName, string propertyValue) + { + _properties[propertyName] = propertyValue; + } + + void IConfiguredInstance.SetChild(string name, Instance instance) + { + setChild(name, instance); + } + + void IConfiguredInstance.SetChildArray(string name, Type type, Instance[] children) + { + setChildArray(name, children); + } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs 2008-08-16 16:44:23 UTC (rev 139) +++ trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs 2008-08-19 01:24:37 UTC (rev 140) @@ -42,14 +42,14 @@ return _args.ContainsKey(key) ? _args[key] : null; } - public void Configure(ConfiguredInstance instance) + public void Configure(IConfiguredInstance instance) { foreach (KeyValuePair<string, object> arg in _args) { if (arg.Value == null) continue; instance.SetProperty(arg.Key, arg.Value.ToString()); - instance.Child(arg.Key).Is(arg.Value); + instance.SetChild(arg.Key, new LiteralInstance(arg.Value)); } } Modified: trunk/Source/StructureMap/Pipeline/IConfiguredInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/IConfiguredInstance.cs 2008-08-16 16:44:23 UTC (rev 139) +++ trunk/Source/StructureMap/Pipeline/IConfiguredInstance.cs 2008-08-19 01:24:37 UTC (rev 140) @@ -11,5 +11,10 @@ object GetChild(string propertyName, Type pluginType, BuildSession buildSession); object Build(Type pluginType, BuildSession session, InstanceBuilder builder); bool HasProperty(string propertyName); + void SetProperty(string name, string value); + void SetChild(string name, Instance instance); + void SetChildArray(string name, Type type, Instance[] children); } + + } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/InstanceMementoPropertyReader.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/InstanceMementoPropertyReader.cs 2008-08-16 16:44:23 UTC (rev 139) +++ trunk/Source/StructureMap/Pipeline/InstanceMementoPropertyReader.cs 2008-08-19 01:24:37 UTC (rev 140) @@ -6,12 +6,12 @@ { public class InstanceMementoPropertyReader : IArgumentVisitor { - private readonly ConfiguredInstance _instance; + private readonly IConfiguredInstance _instance; private readonly InstanceMemento _memento; private readonly PluginGraph _pluginGraph; private readonly Type _pluginType; - public InstanceMementoPropertyReader(ConfiguredInstance instance, InstanceMemento memento, + public InstanceMementoPropertyReader(IConfiguredInstance instance, InstanceMemento memento, PluginGraph pluginGraph, Type pluginType) { _instance = instance; @@ -89,8 +89,8 @@ private void copyChild(string name, Type childType, bool isMandatory) { Instance childInstance = _memento.ReadChildInstance(name, _pluginGraph, childType); - - _instance.Child(name).Is(childInstance); + + _instance.SetChild(name, childInstance); } private void copyChildArray(string name, Type childType) @@ -104,7 +104,7 @@ children[i] = memento.ReadInstance(_pluginGraph, childType); } - _instance.ChildArray(name, childType).Contains(children); + _instance.SetChildArray(name, childType, children); } } } \ No newline at end of file Modified: trunk/Source/StructureMap/StructureMap.csproj =================================================================== --- trunk/Source/StructureMap/StructureMap.csproj 2008-08-16 16:44:23 UTC (rev 139) +++ trunk/Source/StructureMap/StructureMap.csproj 2008-08-19 01:24:37 UTC (rev 140) @@ -406,7 +406,7 @@ <Compile Include="IBootstrapper.cs" /> <Compile Include="Pipeline\BuildFrame.cs" /> <Compile Include="Pipeline\BuildStack.cs" /> - <Compile Include="Pipeline\ConfiguredInstance.Building.cs" /> + <Compile Include="Pipeline\ConfiguredInstanceBase.cs" /> <Compile Include="Pipeline\IStructuredInstance.cs" /> <Compile Include="Pipeline\SerializedInstance.cs" /> <Compile Include="ReflectionHelper.cs" /> Modified: trunk/Source/StructureMap.Testing/Graph/ContainerTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/ContainerTester.cs 2008-08-16 16:44:23 UTC (rev 139) +++ trunk/Source/StructureMap.Testing/Graph/ContainerTester.cs 2008-08-19 01:24:37 UTC (rev 140) @@ -35,11 +35,9 @@ { _manager.Configure(registry => { - registry.AddInstanceOf<Rule>().UsingConcreteType<ColorRule>().SetProperty("color", Color).WithName(Color); - registry.AddInstanceOf<IWidget>().UsingConcreteType<ColorWidget>().SetProperty("color", Color).WithName( - Color); - registry.AddInstanceOf<WidgetMaker>().UsingConcreteType<ColorWidgetMaker>().SetProperty("color", Color). - WithName(Color); + registry.AddInstanceOf<Rule>().UsingConcreteType<ColorRule>().WithProperty("color").EqualTo(Color).WithName(Color); + registry.AddInstanceOf<IWidget>().UsingConcreteType<ColorWidget>().WithProperty("color").EqualTo(Color).WithName(Color); + registry.AddInstanceOf<WidgetMaker>().UsingConcreteType<ColorWidgetMaker>().WithProperty("color").EqualTo(Color).WithName(Color); }); } Modified: trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs 2008-08-16 16:44:23 UTC (rev 139) +++ trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs 2008-08-19 01:24:37 UTC (rev 140) @@ -96,7 +96,7 @@ { ConfiguredInstance instance = (ConfiguredInstance) ComplexRule.GetInstance(); - instance.SetProperty("Int", "abc"); + instance.WithProperty("Int").EqualTo("abc"); ComplexRule rule = (ComplexRule) instance.Build(typeof (Rule), _session); } @@ -149,15 +149,14 @@ public void GetProperty_happy_path() { ConfiguredInstance instance = new ConfiguredInstance(typeof(ColorRule)) - .SetProperty("Color", "Red") - .SetProperty("Age", "34"); + .WithProperty("Color").EqualTo("Red").WithProperty("Age").EqualTo("34"); IConfiguredInstance configuredInstance = instance; Assert.AreEqual("Red", configuredInstance.GetProperty("Color")); Assert.AreEqual("34", configuredInstance.GetProperty("Age")); - instance.SetProperty("Color", "Blue"); + instance.WithProperty("Color").EqualTo("Blue"); Assert.AreEqual("Blue", configuredInstance.GetProperty("Color")); } Modified: trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs 2008-08-16 16:44:23 UTC (rev 139) +++ trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs 2008-08-19 01:24:37 UTC (rev 140) @@ -44,7 +44,7 @@ r => { r.ForRequestedType<OptionalSetterTarget>().TheDefaultIs( - Instance<OptionalSetterTarget>().SetProperty("Name", "Jeremy")); + (Instance<OptionalSetterTarget>()).WithProperty("Name").EqualTo("Jeremy")); r.AddInstanceOf<OptionalSetterTarget>(Instance<OptionalSetterTarget>().WithName("NoName")); }); Modified: trunk/Source/StructureMap.Testing.Widget/Rule.cs =================================================================== --- trunk/Source/StructureMap.Testing.Widget/Rule.cs 2008-08-16 16:44:23 UTC (rev 139) +++ trunk/Source/StructureMap.Testing.Widget/Rule.cs 2008-08-19 01:24:37 UTC (rev 140) @@ -96,14 +96,16 @@ ConfiguredInstance memento = new ConfiguredInstance(typeof(ComplexRule)); memento.Name = "Sample"; - memento.SetProperty("String", "Red"); - memento.SetProperty("String2", "Green"); - memento.SetProperty("Int", "1"); - memento.SetProperty("Long", "2"); - memento.SetProperty("Byte", "3"); - memento.SetProperty("Double", "4"); - memento.SetProperty("Bool", "true"); + IConfiguredInstance instance = memento; + instance.SetProperty("String", "Red"); + instance.SetProperty("String2", "Green"); + instance.SetProperty("Int", "1"); + instance.SetProperty("Long", "2"); + instance.SetProperty("Byte", "3"); + instance.SetProperty("Double", "4"); + instance.SetProperty("Bool", "true"); + return memento; } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2008-08-19 15:27:29
|
Revision: 141 http://structuremap.svn.sourceforge.net/structuremap/?rev=141&view=rev Author: jeremydmiller Date: 2008-08-19 15:27:23 +0000 (Tue, 19 Aug 2008) Log Message: ----------- SmartInstance!!! Modified Paths: -------------- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs trunk/Source/StructureMap/Configuration/DSL/Expressions/ProfileExpression.cs trunk/Source/StructureMap/Configuration/DSL/RegistryExpressions.cs trunk/Source/StructureMap/Graph/Constructor.cs trunk/Source/StructureMap/Graph/Plugin.cs trunk/Source/StructureMap/Graph/SetterPropertyCollection.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs trunk/Source/StructureMap/StructureMap.csproj trunk/Source/StructureMap/StructureMapConfiguration.cs trunk/Source/StructureMap.Testing/BuildSessionTester.cs trunk/Source/StructureMap.Testing/Diagnostics/ValidationBuildSessionTester.cs trunk/Source/StructureMap.Testing/Pipeline/BuildStrategiesTester.cs trunk/Source/StructureMap.Testing/Pipeline/ConstructorInstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/ProfileManagerTester.cs trunk/Source/StructureMap.Testing/Pipeline/ThreadLocalStoragePolicyTester.cs trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj Added Paths: ----------- trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs trunk/Source/StructureMap/Pipeline/PropertyExpression.cs trunk/Source/StructureMap/Pipeline/SmartInstance.cs trunk/Source/StructureMap.Testing/Pipeline/SmartInstanceTester.cs Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2008-08-19 01:24:37 UTC (rev 140) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2008-08-19 15:27:23 UTC (rev 141) @@ -190,7 +190,7 @@ [Obsolete("Kill!")] public CreatePluginFamilyExpression<PLUGINTYPE> TheDefaultIs(Func<PLUGINTYPE> func) { - ConstructorInstance instance = new ConstructorInstance(() => func()); + ConstructorInstance<PLUGINTYPE> instance = new ConstructorInstance<PLUGINTYPE>(func); return TheDefaultIs(instance); } @@ -204,7 +204,7 @@ [Obsolete("Kill!")] public CreatePluginFamilyExpression<PLUGINTYPE> AddInstance(Func<PLUGINTYPE> func) { - ConstructorInstance instance = new ConstructorInstance(() => func()); + ConstructorInstance<PLUGINTYPE> instance = new ConstructorInstance<PLUGINTYPE>(func); return AddInstance(instance); } Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs 2008-08-19 01:24:37 UTC (rev 140) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs 2008-08-19 15:27:23 UTC (rev 141) @@ -45,7 +45,7 @@ public GenericFamilyExpression TheDefaultIs(Func<object> func) { - ConstructorInstance instance = new ConstructorInstance(func); + ConstructorInstance<object> instance = new ConstructorInstance<object>(func); return TheDefaultIs(instance); } Added: trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs (rev 0) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs 2008-08-19 15:27:23 UTC (rev 141) @@ -0,0 +1,46 @@ +using System; +using StructureMap.Pipeline; + +namespace StructureMap.Configuration.DSL.Expressions +{ + public interface IsExpression<T> + { + InstanceExpression<T> Is { get; } + } + + public class InstanceExpression<T> : IsExpression<T> + { + private readonly Action<Instance> _action; + + internal InstanceExpression(Action<Instance> action) + { + _action = action; + } + + public void Is(Instance instance) + { + _action(instance); + } + + private T returnInstance<T>(T instance) where T : Instance + { + Is(instance); + return instance; + } + + public SmartInstance<PLUGGEDTYPE> OfConcreteType<PLUGGEDTYPE>() where PLUGGEDTYPE : T + { + return returnInstance(new SmartInstance<PLUGGEDTYPE>()); + } + + public LiteralInstance Object(T theObject) + { + return returnInstance(new LiteralInstance(theObject)); + } + + InstanceExpression<T> IsExpression<T>.Is + { + get { return this; } + } + } +} Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/ProfileExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/ProfileExpression.cs 2008-08-19 01:24:37 UTC (rev 140) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/ProfileExpression.cs 2008-08-19 15:27:23 UTC (rev 141) @@ -82,7 +82,7 @@ public ProfileExpression Use(Func<T> func) { - ConstructorInstance instance = new ConstructorInstance(delegate { return func(); }); + ConstructorInstance<T> instance = new ConstructorInstance<T>(func); return Use(instance); } Modified: trunk/Source/StructureMap/Configuration/DSL/RegistryExpressions.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/RegistryExpressions.cs 2008-08-19 01:24:37 UTC (rev 140) +++ trunk/Source/StructureMap/Configuration/DSL/RegistryExpressions.cs 2008-08-19 15:27:23 UTC (rev 141) @@ -50,10 +50,10 @@ return new UserControlInstance(url); } - public static ConstructorInstance ConstructedBy<PLUGINTYPE> - (Func<PLUGINTYPE> builder) + public static ConstructorInstance<T> ConstructedBy<T> + (Func<T> builder) { - return new ConstructorInstance(() => builder()); + return new ConstructorInstance<T>(() => builder()); } public static ReferencedInstance Instance(string referencedKey) Modified: trunk/Source/StructureMap/Graph/Constructor.cs =================================================================== --- trunk/Source/StructureMap/Graph/Constructor.cs 2008-08-19 01:24:37 UTC (rev 140) +++ trunk/Source/StructureMap/Graph/Constructor.cs 2008-08-19 15:27:23 UTC (rev 141) @@ -75,11 +75,11 @@ return true; } - public string FindFirstConstructorArgumentOfType<T>() + public string FindFirstConstructorArgumentOfType(Type type) { foreach (ParameterInfo info in _ctor.GetParameters()) { - if (info.ParameterType.Equals(typeof (T))) + if (info.ParameterType.Equals(type)) { return info.Name; } Modified: trunk/Source/StructureMap/Graph/Plugin.cs =================================================================== --- trunk/Source/StructureMap/Graph/Plugin.cs 2008-08-19 01:24:37 UTC (rev 140) +++ trunk/Source/StructureMap/Graph/Plugin.cs 2008-08-19 15:27:23 UTC (rev 141) @@ -82,13 +82,18 @@ public string FindArgumentNameForType<T>() { + return FindArgumentNameForType(typeof (T)); + } + + public string FindArgumentNameForType(Type type) + { string returnValue = - _constructor.FindFirstConstructorArgumentOfType<T>() ?? - _setters.FindFirstConstructorArgumentOfType<T>(); + _constructor.FindFirstConstructorArgumentOfType(type) ?? + _setters.FindFirstConstructorArgumentOfType(type); if (returnValue == null) { - throw new StructureMapException(302, typeof (T).FullName, _pluggedType.FullName); + throw new StructureMapException(302, type.FullName, _pluggedType.FullName); } return returnValue; Modified: trunk/Source/StructureMap/Graph/SetterPropertyCollection.cs =================================================================== --- trunk/Source/StructureMap/Graph/SetterPropertyCollection.cs 2008-08-19 01:24:37 UTC (rev 140) +++ trunk/Source/StructureMap/Graph/SetterPropertyCollection.cs 2008-08-19 15:27:23 UTC (rev 141) @@ -115,11 +115,11 @@ return returnValue; } - public string FindFirstConstructorArgumentOfType<T>() + public string FindFirstConstructorArgumentOfType(Type type) { foreach (SetterProperty setterProperty in this) { - if (setterProperty.Property.PropertyType.Equals(typeof (T))) + if (setterProperty.Property.PropertyType.Equals(type)) { return setterProperty.Name; } Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs 2008-08-19 01:24:37 UTC (rev 140) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs 2008-08-19 15:27:23 UTC (rev 141) @@ -1,5 +1,4 @@ using System; -using System.Configuration; using StructureMap.Configuration.DSL; using StructureMap.Graph; @@ -72,9 +71,9 @@ /// </summary> /// <param name="propertyName"></param> /// <returns></returns> - public PropertyExpression WithProperty(string propertyName) + public PropertyExpression<ConfiguredInstance> WithProperty(string propertyName) { - return new PropertyExpression(this, propertyName); + return new PropertyExpression<ConfiguredInstance>(this, propertyName); } #region Nested type: ChildArrayExpression @@ -193,45 +192,6 @@ #region Nested type: PropertyExpression - /// <summary> - /// Defines the value of a primitive argument to a constructur argument - /// </summary> - public class PropertyExpression - { - private readonly ConfiguredInstance _instance; - private readonly string _propertyName; - - public PropertyExpression(ConfiguredInstance instance, string propertyName) - { - _instance = instance; - _propertyName = propertyName; - } - - /// <summary> - /// Sets the value of the constructor argument - /// </summary> - /// <param name="propertyValue"></param> - /// <returns></returns> - public ConfiguredInstance EqualTo(object propertyValue) - { - _instance.setProperty(_propertyName, propertyValue.ToString()); - return _instance; - } - - /// <summary> - /// Sets the value of the constructor argument to the key/value in the - /// AppSettings - /// </summary> - /// <param name="appSettingKey"></param> - /// <returns></returns> - public ConfiguredInstance EqualToAppSetting(string appSettingKey) - { - string propertyValue = ConfigurationManager.AppSettings[appSettingKey]; - _instance.setProperty(_propertyName, propertyValue); - return _instance; - } - } - #endregion } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs 2008-08-19 01:24:37 UTC (rev 140) +++ trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs 2008-08-19 15:27:23 UTC (rev 141) @@ -4,22 +4,21 @@ { - public class ConstructorInstance : ExpressedInstance<ConstructorInstance> + public class ConstructorInstance<T> : ExpressedInstance<ConstructorInstance<T>> { - private Func<object> _builder; + private readonly Func<BuildSession, T> _builder; - public ConstructorInstance(Func<object> builder) + public ConstructorInstance(Func<BuildSession, T> builder) { _builder = builder; } - public Func<object> Builder + public ConstructorInstance(Func<T> func) { - get { return _builder; } - set { _builder = value; } + _builder = s => func(); } - protected override ConstructorInstance thisInstance + protected override ConstructorInstance<T> thisInstance { get { return this; } } @@ -28,7 +27,7 @@ { try { - return _builder(); + return _builder(session); } catch (Exception ex) { Added: trunk/Source/StructureMap/Pipeline/PropertyExpression.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/PropertyExpression.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/PropertyExpression.cs 2008-08-19 15:27:23 UTC (rev 141) @@ -0,0 +1,43 @@ +using System.Configuration; + +namespace StructureMap.Pipeline +{ + /// <summary> + /// Defines the value of a primitive argument to a constructur argument + /// </summary> + public class PropertyExpression<T> where T : IConfiguredInstance + { + private readonly IConfiguredInstance _instance; + private readonly string _propertyName; + + public PropertyExpression(IConfiguredInstance instance, string propertyName) + { + _instance = instance; + _propertyName = propertyName; + } + + /// <summary> + /// Sets the value of the constructor argument + /// </summary> + /// <param name="propertyValue"></param> + /// <returns></returns> + public T EqualTo(object propertyValue) + { + _instance.SetProperty(_propertyName, propertyValue.ToString()); + return (T) _instance; + } + + /// <summary> + /// Sets the value of the constructor argument to the key/value in the + /// AppSettings + /// </summary> + /// <param name="appSettingKey"></param> + /// <returns></returns> + public T EqualToAppSetting(string appSettingKey) + { + string propertyValue = ConfigurationManager.AppSettings[appSettingKey]; + _instance.SetProperty(_propertyName, propertyValue); + return (T) _instance; + } + } +} \ No newline at end of file Added: trunk/Source/StructureMap/Pipeline/SmartInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/SmartInstance.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/SmartInstance.cs 2008-08-19 15:27:23 UTC (rev 141) @@ -0,0 +1,143 @@ +using System; +using System.Collections.Generic; +using System.Linq.Expressions; +using StructureMap.Configuration.DSL.Expressions; +using StructureMap.Graph; + +namespace StructureMap.Pipeline +{ + public class SmartInstance<T> : ConfiguredInstanceBase<SmartInstance<T>> + { + private readonly List<Action<T>> _actions = new List<Action<T>>(); + + public SmartInstance() : base(typeof(T)) + { + } + + protected override SmartInstance<T> thisInstance + { + get { return this; } + } + + protected override string getDescription() + { + return "Smart Instance for " + getConcreteType().FullName; + } + + public PropertyExpression<SmartInstance<T>> WithCtorArg(string argumentName) + { + return new PropertyExpression<SmartInstance<T>>(this, argumentName); + } + + protected override object build(Type pluginType, BuildSession session) + { + T builtTarget = (T) base.build(pluginType, session); + foreach (Action<T> action in _actions) + { + action(builtTarget); + } + + return builtTarget; + } + + public SmartInstance<T> SetProperty(Action<T> action) + { + _actions.Add(action); + return this; + } + + public PropertyExpression<SmartInstance<T>> WithProperty(Expression<Func<T, object>> expression) + { + string propertyName = ReflectionHelper.GetProperty(expression).Name; + return WithProperty(propertyName); + } + + public PropertyExpression<SmartInstance<T>> WithProperty(string propertyName) + { + return new PropertyExpression<SmartInstance<T>>(this, propertyName); + } + + public DependencyExpression<T, CTORTYPE> CtorDependency<CTORTYPE>() + { + string constructorArg = getArgumentNameForType<CTORTYPE>(); + return CtorDependency<CTORTYPE>(constructorArg); + } + + private string getArgumentNameForType<CTORTYPE>() + { + Plugin plugin = PluginCache.GetPlugin(getConcreteType()); + return plugin.FindArgumentNameForType<CTORTYPE>(); + } + + public DependencyExpression<T, CTORTYPE> CtorDependency<CTORTYPE>(string constructorArg) + { + return new DependencyExpression<T, CTORTYPE>(this, constructorArg); + } + + public DependencyExpression<T, SETTERTYPE> SetterDependency<SETTERTYPE>(Expression<Func<T, SETTERTYPE>> expression) + { + string propertyName = ReflectionHelper.GetProperty(expression).Name; + return new DependencyExpression<T, SETTERTYPE>(this, propertyName); + } + + public ArrayDefinitionExpression<T, CHILD> TheArrayOf<CHILD>() + { + if (typeof(CHILD).IsArray) + { + throw new ApplicationException("Please specify the element type in the call to TheArrayOf"); + } + + Plugin plugin = PluginCache.GetPlugin(typeof (T)); + string propertyName = plugin.FindArgumentNameForType(typeof (CHILD).MakeArrayType()); + + return new ArrayDefinitionExpression<T, CHILD>(this, propertyName); + } + + public class ArrayDefinitionExpression<T, ARRAY> + { + private SmartInstance<T> _instance; + private string _propertyName; + + internal ArrayDefinitionExpression(SmartInstance<T> instance, string propertyName) + { + _instance = instance; + _propertyName = propertyName; + } + + public SmartInstance<T> Contains(Action<InstanceExpression<ARRAY>> action) + { + List<Instance> list = new List<Instance>(); + + InstanceExpression<ARRAY> child = new InstanceExpression<ARRAY>(i => list.Add(i)); + action(child); + + _instance.setChildArray(_propertyName, list.ToArray()); + + return _instance; + } + } + + public class DependencyExpression<T, CHILD> + { + private readonly SmartInstance<T> _instance; + private readonly string _propertyName; + + internal DependencyExpression(SmartInstance<T> instance, string propertyName) + { + _instance = instance; + _propertyName = propertyName; + } + + public SmartInstance<T> Is(Func<InstanceExpression<CHILD>, Instance> func) + { + var expression = new InstanceExpression<CHILD>(i => _instance.setChild(_propertyName, i)); + Instance instance = func(expression); + + + return _instance; + } + } + } + + +} \ No newline at end of file Modified: trunk/Source/StructureMap/StructureMap.csproj =================================================================== --- trunk/Source/StructureMap/StructureMap.csproj 2008-08-19 01:24:37 UTC (rev 140) +++ trunk/Source/StructureMap/StructureMap.csproj 2008-08-19 15:27:23 UTC (rev 141) @@ -390,6 +390,7 @@ </None> <None Include="ConfigurationClasses.cd" /> <Compile Include="Configuration\DictionaryReader.cs" /> + <Compile Include="Configuration\DSL\Expressions\InstanceExpression.cs" /> <Compile Include="Configuration\ITypeReader.cs" /> <Compile Include="Configuration\PrimitiveArrayReader.cs" /> <Compile Include="Configuration\TypeReaderFactory.cs" /> @@ -408,7 +409,9 @@ <Compile Include="Pipeline\BuildStack.cs" /> <Compile Include="Pipeline\ConfiguredInstanceBase.cs" /> <Compile Include="Pipeline\IStructuredInstance.cs" /> + <Compile Include="Pipeline\PropertyExpression.cs" /> <Compile Include="Pipeline\SerializedInstance.cs" /> + <Compile Include="Pipeline\SmartInstance.cs" /> <Compile Include="ReflectionHelper.cs" /> <Compile Include="Util\Cache.cs" /> </ItemGroup> Modified: trunk/Source/StructureMap/StructureMapConfiguration.cs =================================================================== --- trunk/Source/StructureMap/StructureMapConfiguration.cs 2008-08-19 01:24:37 UTC (rev 140) +++ trunk/Source/StructureMap/StructureMapConfiguration.cs 2008-08-19 15:27:23 UTC (rev 141) @@ -164,16 +164,19 @@ /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> + [Obsolete] public static Registry.ConfiguredInstanceExpression<T> AddInstanceOf<T>() { return _registry.AddInstanceOf<T>(); } + [Obsolete] public static void AddInstanceOf<T>(Func<T> func) { - _registry.AddInstanceOf<T>(new ConstructorInstance(() => func)); + _registry.AddInstanceOf<T>(new ConstructorInstance<T>(func)); } + [Obsolete] public static void AddInstanceOf<T>(Instance instance) { _registry.ForRequestedType<T>().AddInstance(instance); @@ -187,6 +190,7 @@ /// <typeparam name="T"></typeparam> /// <param name="target"></param> /// <returns></returns> + [Obsolete] public static LiteralInstance AddInstanceOf<T>(T target) { return _registry.AddInstanceOf(target); Modified: trunk/Source/StructureMap.Testing/BuildSessionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/BuildSessionTester.cs 2008-08-19 01:24:37 UTC (rev 140) +++ trunk/Source/StructureMap.Testing/BuildSessionTester.cs 2008-08-19 15:27:23 UTC (rev 141) @@ -56,7 +56,7 @@ BuildSession session = new BuildSession(new PluginGraph()); BuildSession session2 = new BuildSession(new PluginGraph()); - ConstructorInstance instance = new ConstructorInstance(delegate + ConstructorInstance<ColorRule> instance = new ConstructorInstance<ColorRule>(() => { count++; return new ColorRule("Red"); @@ -94,7 +94,7 @@ int count = 0; BuildSession session = new BuildSession(new PluginGraph()); - ConstructorInstance instance = new ConstructorInstance(delegate + ConstructorInstance<ColorRule> instance = new ConstructorInstance<ColorRule>(() => { count++; return new ColorRule("Red"); @@ -117,7 +117,7 @@ { int count = 0; - ConstructorInstance instance = new ConstructorInstance(delegate + ConstructorInstance<ColorRule> instance = new ConstructorInstance<ColorRule>( () => { count++; return new ColorRule("Red"); Modified: trunk/Source/StructureMap.Testing/Diagnostics/ValidationBuildSessionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Diagnostics/ValidationBuildSessionTester.cs 2008-08-19 01:24:37 UTC (rev 140) +++ trunk/Source/StructureMap.Testing/Diagnostics/ValidationBuildSessionTester.cs 2008-08-19 15:27:23 UTC (rev 141) @@ -30,7 +30,7 @@ return session.BuildErrors[0]; } - private ConstructorInstance errorInstance() + private ConstructorInstance<IWidget> errorInstance() { return ConstructedBy<IWidget>(delegate { throw new NotSupportedException("You can't make me!"); }); } Modified: trunk/Source/StructureMap.Testing/Pipeline/BuildStrategiesTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/BuildStrategiesTester.cs 2008-08-19 01:24:37 UTC (rev 140) +++ trunk/Source/StructureMap.Testing/Pipeline/BuildStrategiesTester.cs 2008-08-19 15:27:23 UTC (rev 141) @@ -106,10 +106,10 @@ public void Singleton_build_policy() { SingletonPolicy policy = new SingletonPolicy(); - ConstructorInstance instance1 = - new ConstructorInstance(delegate { return new ColorService("Red"); }).WithName("Red"); - ConstructorInstance instance2 = - new ConstructorInstance(delegate { return new ColorService("Green"); }).WithName("Green"); + ConstructorInstance<ColorService> instance1 = + new ConstructorInstance<ColorService>(() => new ColorService("Red")).WithName("Red"); + ConstructorInstance<ColorService> instance2 = + new ConstructorInstance<ColorService>(() => new ColorService("Green")).WithName("Green"); ColorService red1 = (ColorService) policy.Build(new StubBuildSession(), null, instance1); ColorService green1 = (ColorService) policy.Build(new StubBuildSession(), null, instance2); Modified: trunk/Source/StructureMap.Testing/Pipeline/ConstructorInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/ConstructorInstanceTester.cs 2008-08-19 01:24:37 UTC (rev 140) +++ trunk/Source/StructureMap.Testing/Pipeline/ConstructorInstanceTester.cs 2008-08-19 15:27:23 UTC (rev 141) @@ -11,7 +11,10 @@ [Test] public void Sad_path_inner_function_throws_exception_207_with_key_and_plugin_type() { - ConstructorInstance instance = new ConstructorInstance(delegate { throw new NotImplementedException(); }); + ConstructorInstance<object> instance = new ConstructorInstance<object>(() => + { + throw new NotImplementedException(); + }); try { Modified: trunk/Source/StructureMap.Testing/Pipeline/ProfileManagerTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/ProfileManagerTester.cs 2008-08-19 01:24:37 UTC (rev 140) +++ trunk/Source/StructureMap.Testing/Pipeline/ProfileManagerTester.cs 2008-08-19 15:27:23 UTC (rev 141) @@ -25,7 +25,7 @@ private void addDefaultToPluginFamily<T>(string name) { - ConstructorInstance instance = new ConstructorInstance(null).WithName(name); + LiteralInstance instance = new LiteralInstance(0).WithName(name); PluginFamily family = _pluginGraph.FindFamily(typeof (T)); family.AddInstance(instance); family.DefaultInstanceKey = instance.Name; @@ -35,7 +35,7 @@ { _manager.SetDefault(profile, typeof (T), new ReferencedInstance(name)); PluginFamily family = _pluginGraph.FindFamily(typeof (T)); - family.AddInstance(new ConstructorInstance(null).WithName(name)); + family.AddInstance(new LiteralInstance(0).WithName(name)); } private void addDefaultToMachine<T>(string name) Added: trunk/Source/StructureMap.Testing/Pipeline/SmartInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/SmartInstanceTester.cs (rev 0) +++ trunk/Source/StructureMap.Testing/Pipeline/SmartInstanceTester.cs 2008-08-19 15:27:23 UTC (rev 141) @@ -0,0 +1,158 @@ +using System; +using NUnit.Framework; +using StructureMap.Pipeline; +using StructureMap.Testing.Widget; + +namespace StructureMap.Testing.Pipeline +{ + [TestFixture] + public class SmartInstanceTester + { + private IStructuredInstance structuredInstance; + private IConfiguredInstance configuredInstance; + + private SmartInstance<T> instanceOf<T>() + { + var instance = new SmartInstance<T>(); + structuredInstance = instance; + configuredInstance = instance; + + return instance; + } + + public T build<T>(Action<SmartInstance<T>> action) + { + SmartInstance<T> instance = instanceOf<T>(); + action(instance); + + var container = new Container(r => r.ForRequestedType<T>().TheDefaultIs(instance)); + return container.GetInstance<T>(); + } + + [Test] + public void specify_a_constructor_dependency() + { + var widget = new ColorWidget("Red"); + build<ClassWithWidget>(i => i.CtorDependency<IWidget>("widget").Is(x => x.Object(widget))).Widget. + ShouldBeTheSameAs(widget); + } + + [Test] + public void specify_a_constructor_dependency_by_type() + { + var widget = new ColorWidget("Red"); + build<ClassWithWidget>(i => i.CtorDependency<IWidget>().Is(x => x.Object(widget))).Widget.ShouldBeTheSameAs( + widget); + } + + [Test] + public void specify_a_property_dependency() + { + var widget = new ColorWidget("Red"); + build<ClassWithWidgetProperty>(i => i.SetterDependency(x => x.Widget).Is(x => x.Object(widget))).Widget. + ShouldBeTheSameAs(widget); + } + + [Test] + public void specify_a_simple_property() + { + build<SimplePropertyTarget>(i => i.SetProperty(x => x.Name = "Jeremy")).Name.ShouldEqual("Jeremy"); + build<SimplePropertyTarget>(i => i.SetProperty(x => x.Age = 16)).Age.ShouldEqual(16); + } + + [Test] + public void specify_a_simple_property_name_with_equal_to() + { + build<SimplePropertyTarget>(i => i.WithProperty("Name").EqualTo("Scott")).Name.ShouldEqual("Scott"); + } + + [Test] + public void specify_a_simple_property_with_equal_to() + { + build<SimplePropertyTarget>(i => i.WithProperty(x => x.Name).EqualTo("Bret")).Name.ShouldEqual("Bret"); + } + + [Test] + public void successfully_specify_the_constructor_argument_of_a_string() + { + build<ColorRule>(i => i.WithCtorArg("color").EqualTo("Red")).Color.ShouldEqual("Red"); + } + + [Test] + public void specify_an_array_as_a_constructor() + { + IWidget widget1 = new AWidget(); + IWidget widget2 = new AWidget(); + IWidget widget3 = new AWidget(); + + build<ClassWithWidgetArrayCtor>(i => i.TheArrayOf<IWidget>().Contains(x => + { + x.Object(widget1); + x.Object(widget2); + x.Object(widget3); + })).Widgets.ShouldEqual(new IWidget[] {widget1, widget2, widget3}); + } + + + [Test] + public void specify_an_array_as_a_property() + { + IWidget widget1 = new AWidget(); + IWidget widget2 = new AWidget(); + IWidget widget3 = new AWidget(); + + build<ClassWithWidgetArraySetter>(i => i.TheArrayOf<IWidget>().Contains(x => + { + x.Object(widget1); + x.Object(widget2); + x.Object(widget3); + })).Widgets.ShouldEqual(new IWidget[] { widget1, widget2, widget3 }); + } + } + + public class ClassWithWidgetArrayCtor + { + private readonly IWidget[] _widgets; + + public ClassWithWidgetArrayCtor(IWidget[] widgets) + { + _widgets = widgets; + } + + public IWidget[] Widgets + { + get { return _widgets; } + } + } + + public class ClassWithWidgetArraySetter + { + public IWidget[] Widgets { get; set; } + } + + public class SimplePropertyTarget + { + public string Name { get; set; } + public int Age { get; set; } + } + + public class ClassWithWidget + { + private readonly IWidget _widget; + + public ClassWithWidget(IWidget widget) + { + _widget = widget; + } + + public IWidget Widget + { + get { return _widget; } + } + } + + public class ClassWithWidgetProperty + { + public IWidget Widget { get; set; } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Pipeline/ThreadLocalStoragePolicyTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/ThreadLocalStoragePolicyTester.cs 2008-08-19 01:24:37 UTC (rev 140) +++ trunk/Source/StructureMap.Testing/Pipeline/ThreadLocalStoragePolicyTester.cs 2008-08-19 15:27:23 UTC (rev 141) @@ -15,7 +15,7 @@ public void SetUp() { _policy = new ThreadLocalStoragePolicy(); - _instance = new ConstructorInstance(delegate { return new ColorRule("Red"); }).WithName("Red"); + _instance = new ConstructorInstance<ColorRule>(() => new ColorRule("Red")).WithName("Red"); } #endregion @@ -24,7 +24,7 @@ private ColorRule _rule1; private ColorRule _rule2; private ColorRule _rule3; - private ConstructorInstance _instance; + private ConstructorInstance<ColorRule> _instance; private void findRule1() Modified: trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj =================================================================== --- trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2008-08-19 01:24:37 UTC (rev 140) +++ trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2008-08-19 15:27:23 UTC (rev 141) @@ -370,6 +370,7 @@ <Compile Include="Pipeline\PrototypeInstanceTester.cs" /> <Compile Include="Pipeline\ReferencedInstanceTester.cs" /> <Compile Include="Pipeline\SerializedInstanceTester.cs" /> + <Compile Include="Pipeline\SmartInstanceTester.cs" /> <Compile Include="Pipeline\StubBuildSession.cs" /> <Compile Include="Pipeline\ThreadLocalStoragePolicyTester.cs" /> <Compile Include="Pipeline\TypeRulesTester.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2008-08-19 17:56:07
|
Revision: 142 http://structuremap.svn.sourceforge.net/structuremap/?rev=142&view=rev Author: jeremydmiller Date: 2008-08-19 17:56:03 +0000 (Tue, 19 Aug 2008) Log Message: ----------- More SmartInstance work Modified Paths: -------------- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs trunk/Source/StructureMap/Pipeline/SmartInstance.cs trunk/Source/StructureMap.Testing/Configuration/DSL/ConstructorExpressionTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/DeepInstanceTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/InjectArrayTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/InterceptAllInstancesOfPluginTypeTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/InterceptorTesting.cs Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2008-08-19 15:27:23 UTC (rev 141) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2008-08-19 17:56:03 UTC (rev 142) @@ -31,11 +31,16 @@ }); } - public CreatePluginFamilyExpression<PLUGINTYPE> AddInstances(params Instance[] instances) + public CreatePluginFamilyExpression<PLUGINTYPE> AddInstances(Action<InstanceExpression<PLUGINTYPE>> action) { + List<Instance> list = new List<Instance>(); + + InstanceExpression<PLUGINTYPE> child = new InstanceExpression<PLUGINTYPE>(i => list.Add(i)); + action(child); + return alterAndContinue(family => { - foreach (Instance instance in instances) + foreach (Instance instance in list) { family.AddInstance(instance); } @@ -181,6 +186,14 @@ return this; } + public IsExpression<PLUGINTYPE> TheDefault + { + get + { + return new InstanceExpression<PLUGINTYPE>(i => TheDefaultIs(i)); + } + } + [Obsolete("Kill!")] public CreatePluginFamilyExpression<PLUGINTYPE> TheDefaultIs(PLUGINTYPE @object) { Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs 2008-08-19 15:27:23 UTC (rev 141) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs 2008-08-19 17:56:03 UTC (rev 142) @@ -42,5 +42,25 @@ { get { return this; } } + + public ReferencedInstance References(string key) + { + return returnInstance(new ReferencedInstance(key)); + } + + public DefaultInstance TheDefault() + { + return returnInstance(new DefaultInstance()); + } + + public ConstructorInstance<T> ConstructedBy(Func<T> func) + { + return returnInstance(new ConstructorInstance<T>(func)); + } + + public ConstructorInstance<T> ConstructedBy(Func<BuildSession, T> func) + { + return returnInstance(new ConstructorInstance<T>(func)); + } } } Modified: trunk/Source/StructureMap/Pipeline/SmartInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/SmartInstance.cs 2008-08-19 15:27:23 UTC (rev 141) +++ trunk/Source/StructureMap/Pipeline/SmartInstance.cs 2008-08-19 17:56:03 UTC (rev 142) @@ -80,6 +80,11 @@ return new DependencyExpression<T, SETTERTYPE>(this, propertyName); } + public DependencyExpression<T, SETTERTYPE> SetterDependency<SETTERTYPE>() + { + return CtorDependency<SETTERTYPE>(); + } + public ArrayDefinitionExpression<T, CHILD> TheArrayOf<CHILD>() { if (typeof(CHILD).IsArray) @@ -128,11 +133,10 @@ _propertyName = propertyName; } - public SmartInstance<T> Is(Func<InstanceExpression<CHILD>, Instance> func) + public SmartInstance<T> Is(Action<InstanceExpression<CHILD>> action) { var expression = new InstanceExpression<CHILD>(i => _instance.setChild(_propertyName, i)); - Instance instance = func(expression); - + action(expression); return _instance; } Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/ConstructorExpressionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/ConstructorExpressionTester.cs 2008-08-19 15:27:23 UTC (rev 141) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/ConstructorExpressionTester.cs 2008-08-19 17:56:03 UTC (rev 142) @@ -31,14 +31,15 @@ Concretion concretion1 = new Concretion(); Concretion concretion2 = new Concretion(); - IContainer manager = new Container(registry => registry.ForRequestedType<Abstraction>() - .AddInstances( - ConstructedBy<Abstraction>(() => concretion1).WithName("One"), - ConstructedBy<Abstraction>(() => concretion2).WithName("Two") - )); + IContainer container = new Container(r => + r.ForRequestedType<Abstraction>().AddInstances(x => + { + x.ConstructedBy(() => concretion1).WithName("One"); + x.ConstructedBy(() => concretion2).WithName("Two"); + })); - Assert.AreSame(concretion1, manager.GetInstance<Abstraction>("One")); - Assert.AreSame(concretion2, manager.GetInstance<Abstraction>("Two")); + Assert.AreSame(concretion1, container.GetInstance<Abstraction>("One")); + Assert.AreSame(concretion2, container.GetInstance<Abstraction>("Two")); } [Test] Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/DeepInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/DeepInstanceTester.cs 2008-08-19 15:27:23 UTC (rev 141) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/DeepInstanceTester.cs 2008-08-19 17:56:03 UTC (rev 142) @@ -126,6 +126,26 @@ ) )); } + + + [Test] + public void DeepInstanceTest_with_SmartInstance() + { + assertThingMatches(registry => + { + registry.ForRequestedType<Thing>().TheDefault.Is.OfConcreteType<Thing>() + .WithCtorArg("name").EqualTo("Jeremy") + .WithCtorArg("count").EqualTo(4) + .WithCtorArg("average").EqualTo(.333) + .SetterDependency<Rule>().Is(x => + { + x.OfConcreteType<WidgetRule>().SetterDependency<IWidget>().Is( + c => c.OfConcreteType<ColorWidget>().WithCtorArg("color").EqualTo("yellow")); + }); + }); + } + + } public class Thing Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/InjectArrayTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/InjectArrayTester.cs 2008-08-19 15:27:23 UTC (rev 141) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/InjectArrayTester.cs 2008-08-19 17:56:03 UTC (rev 142) @@ -170,7 +170,32 @@ Assert.IsInstanceOfType(typeof (Handler1), processor.Handlers[1]); } + [Test] + public void PlaceMemberInArrayByReference_with_SmartInstance() + { + IContainer manager = new Container(registry => + { + registry.AddInstanceOf<IHandler>().UsingConcreteType<Handler1>().WithName("One"); + registry.AddInstanceOf<IHandler>().UsingConcreteType<Handler2>().WithName("Two"); + + registry.ForRequestedType<Processor>().TheDefault.Is.OfConcreteType<Processor>() + .WithCtorArg("name").EqualTo("Jeremy") + .TheArrayOf<IHandler>().Contains(x => + { + x.References("Two"); + x.References("One"); + }); + + }); + + var processor = manager.GetInstance<Processor>(); + + Assert.IsInstanceOfType(typeof(Handler2), processor.Handlers[0]); + Assert.IsInstanceOfType(typeof(Handler1), processor.Handlers[1]); + } + + [Test] public void ProgrammaticallyInjectArrayAllInline() { IContainer manager = new Container(registry => registry.ForRequestedType<Processor>() @@ -191,6 +216,30 @@ Assert.IsInstanceOfType(typeof (Handler3), processor.Handlers[2]); } + [Test] + public void ProgrammaticallyInjectArrayAllInline_with_smart_instance() + { + IContainer container = new Container(r => + { + r.ForRequestedType<Processor>().TheDefault.Is.OfConcreteType<Processor>() + .WithCtorArg("name").EqualTo("Jeremy") + .TheArrayOf<IHandler>().Contains(x => + { + x.OfConcreteType<Handler1>(); + x.OfConcreteType<Handler2>(); + x.OfConcreteType<Handler3>(); + }); + + int number = 0; + }); + + var processor = container.GetInstance<Processor>(); + + Assert.IsInstanceOfType(typeof(Handler1), processor.Handlers[0]); + Assert.IsInstanceOfType(typeof(Handler2), processor.Handlers[1]); + Assert.IsInstanceOfType(typeof(Handler3), processor.Handlers[2]); + } + [Test, ExpectedException(typeof (StructureMapException), ExpectedMessage = Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/InterceptAllInstancesOfPluginTypeTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/InterceptAllInstancesOfPluginTypeTester.cs 2008-08-19 15:27:23 UTC (rev 141) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/InterceptAllInstancesOfPluginTypeTester.cs 2008-08-19 17:56:03 UTC (rev 142) @@ -18,19 +18,31 @@ _defaultRegistry = (registry => { - registry.ForRequestedType<IService>() - .AddInstances( - Instance<ColorService>().WithName("Red").WithProperty("color"). - EqualTo( - "Red"), - Object<IService>(new ColorService("Yellow")).WithName("Yellow"), - ConstructedBy<IService>( - delegate { return new ColorService("Purple"); }) - .WithName("Purple"), - Instance<ColorService>().WithName("Decorated").WithProperty("color") - . - EqualTo("Orange") - ); + //registry.ForRequestedType<IService>() + // .AddInstances( + // Instance<ColorService>().WithName("Red").WithProperty("color"). + // EqualTo( + // "Red"), + // Object<IService>(new ColorService("Yellow")).WithName("Yellow"), + // ConstructedBy<IService>( + // delegate { return new ColorService("Purple"); }) + // .WithName("Purple"), + // Instance<ColorService>().WithName("Decorated").WithProperty("color") + // . + // EqualTo("Orange") + // ); + + registry.ForRequestedType<IService>().AddInstances(x => + { + x.OfConcreteType<ColorService>().WithName("Red").WithProperty("color").EqualTo("Red"); + + x.Object(new ColorService("Yellow")).WithName("Yellow"); + + x.ConstructedBy(() => new ColorService("Purple")).WithName("Purple"); + + x.OfConcreteType<ColorService>().WithName("Decorated").WithProperty("color").EqualTo("Orange"); + + }); }); } @@ -95,4 +107,92 @@ Assert.AreEqual(yellow, _lastService); } } + + [TestFixture] + public class InterceptAllInstancesOfPluginTypeTester_with_SmartInstance : Registry + { + #region Setup/Teardown + + [SetUp] + public void SetUp() + { + _lastService = null; + _manager = null; + + _defaultRegistry = (registry => + registry.ForRequestedType<IService>().AddInstances(x => + { + x.OfConcreteType<ColorService>().WithName("Red") + .WithCtorArg("color").EqualTo("Red"); + + x.Object(new ColorService("Yellow")).WithName("Yellow"); + + x.ConstructedBy(() => new ColorService("Purple")).WithName("Purple"); + + x.OfConcreteType<ColorService>().WithName("Decorated").WithCtorArg("color").EqualTo( + "Orange"); + })); + } + + #endregion + + private IService _lastService; + private IContainer _manager; + private Action<Registry> _defaultRegistry; + + private IService getService(Action<Registry> action, string name) + { + if (_manager == null) + { + _manager = new Container(registry => + { + _defaultRegistry(registry); + action(registry); + }); + } + + return _manager.GetInstance<IService>(name); + } + + [Test] + public void EnrichForAll() + { + Action<Registry> action = registry => registry.ForRequestedType<IService>() + .EnrichWith(s => new DecoratorService(s)) + .AddInstance( + ConstructedBy<IService>(() => new ColorService("Green")) + .WithName("Green")); + + + IService green = getService(action, "Green"); + + + var decoratorService = (DecoratorService) green; + var innerService = (ColorService) decoratorService.Inner; + Assert.AreEqual("Green", innerService.Color); + } + + [Test] + public void OnStartupForAll() + { + Action<Registry> action = registry => registry.ForRequestedType<IService>() + .OnCreation(s => _lastService = s) + .AddInstance( + ConstructedBy<IService>(() => new ColorService("Green")) + .WithName("Green")); + + + IService red = getService(action, "Red"); + Assert.AreSame(red, _lastService); + + IService purple = getService(action, "Purple"); + Assert.AreSame(purple, _lastService); + + IService green = getService(action, "Green"); + Assert.AreSame(green, _lastService); + + IService yellow = getService(action, "Yellow"); + Assert.AreEqual(yellow, _lastService); + } + } } \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/InterceptorTesting.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/InterceptorTesting.cs 2008-08-19 15:27:23 UTC (rev 141) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/InterceptorTesting.cs 2008-08-19 17:56:03 UTC (rev 142) @@ -15,41 +15,65 @@ { _lastService = null; - _manager = 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(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<ColorService>(s => _lastService = s) + .WithName("Intercepted") + .WithProperty("color").EqualTo("Red"); + + x.OfConcreteType<ColorService>() + .WithName("NotIntercepted") + .WithProperty("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.OfConcreteType<ColorService>().WithName("Decorated").EnrichWith<IService>(s => new DecoratorService(s)) + .WithCtorArg("color").EqualTo("Orange"); + + x.Object(new ColorService("Yellow")).WithName("Bad") + .OnCreation<ColorService>(obj => { throw new ApplicationException("Bad!"); }); + })); } #endregion private ColorService _lastService; - private IContainer _manager; + private IContainer _container; [Test] public void DecorateAConstructedService() { - IService service = _manager.GetInstance<IService>("Purple"); + IService service = _container.GetInstance<IService>("Purple"); DecoratorService decoratorService = (DecoratorService) service; ColorService innerService = (ColorService) decoratorService.Inner; @@ -59,7 +83,7 @@ [Test] public void DecorateInline() { - IService service = _manager.GetInstance<IService>("Decorated"); + IService service = _container.GetInstance<IService>("Decorated"); DecoratorService decoratorService = (DecoratorService) service; ColorService innerService = (ColorService) decoratorService.Inner; @@ -71,7 +95,7 @@ public void OnCreationWithAConstructedService() { Assert.IsNull(_lastService); - IService interceptedService = _manager.GetInstance<IService>("Yellow"); + IService interceptedService = _container.GetInstance<IService>("Yellow"); Assert.AreSame(_lastService, interceptedService); } @@ -82,10 +106,10 @@ // "NotIntercepted" should not. Assert.IsNull(_lastService); - _manager.GetInstance<IService>("NotIntercepted"); + _container.GetInstance<IService>("NotIntercepted"); Assert.IsNull(_lastService); - IService interceptedService = _manager.GetInstance<IService>("Intercepted"); + IService interceptedService = _container.GetInstance<IService>("Intercepted"); Assert.AreSame(_lastService, interceptedService); } @@ -94,7 +118,7 @@ { try { - _manager.GetInstance<IService>("Bad"); + _container.GetInstance<IService>("Bad"); Assert.Fail("Should have thrown an error"); } catch (StructureMapException e) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2008-08-19 18:03:13
|
Revision: 143 http://structuremap.svn.sourceforge.net/structuremap/?rev=143&view=rev Author: jeremydmiller Date: 2008-08-19 18:03:10 +0000 (Tue, 19 Aug 2008) Log Message: ----------- cleaning up the way enrichment and oncreation lambdas are captured on SmartInstance Modified Paths: -------------- trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs trunk/Source/StructureMap/Pipeline/SmartInstance.cs trunk/Source/StructureMap.Testing/Configuration/DSL/InterceptorTesting.cs Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs 2008-08-19 17:56:03 UTC (rev 142) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs 2008-08-19 18:03:10 UTC (rev 143) @@ -1,11 +1,35 @@ using System; using StructureMap.Configuration.DSL; using StructureMap.Graph; +using StructureMap.Interceptors; namespace StructureMap.Pipeline { public partial class ConfiguredInstance { + public ConfiguredInstance WithName(string instanceKey) + { + Name = instanceKey; + return this; + } + + public ConfiguredInstance OnCreation<TYPE>(Action<TYPE> handler) + { + StartupInterceptor<TYPE> interceptor = new StartupInterceptor<TYPE>(handler); + Interceptor = interceptor; + + return this; + } + + public ConfiguredInstance EnrichWith<TYPE>(EnrichmentHandler<TYPE> handler) + { + EnrichmentInterceptor<TYPE> interceptor = new EnrichmentInterceptor<TYPE>(handler); + Interceptor = interceptor; + + return this; + } + + public ChildArrayExpression ChildArray<PLUGINTYPE>(string propertyName) { validateTypeIsArray<PLUGINTYPE>(); Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs 2008-08-19 17:56:03 UTC (rev 142) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs 2008-08-19 18:03:10 UTC (rev 143) @@ -19,12 +19,6 @@ { } - - protected override ConfiguredInstance thisInstance - { - get { return this; } - } - #region IStructuredInstance Members #endregion Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs 2008-08-19 17:56:03 UTC (rev 142) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs 2008-08-19 18:03:10 UTC (rev 143) @@ -4,7 +4,7 @@ namespace StructureMap.Pipeline { - public abstract class ConfiguredInstanceBase<T> : ExpressedInstance<T>, IConfiguredInstance, IStructuredInstance + public abstract class ConfiguredInstanceBase<T> : Instance, IConfiguredInstance, IStructuredInstance { protected Dictionary<string, Instance> _children = new Dictionary<string, Instance>(); protected Dictionary<string, string> _properties = new Dictionary<string, string>(); Modified: trunk/Source/StructureMap/Pipeline/SmartInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/SmartInstance.cs 2008-08-19 17:56:03 UTC (rev 142) +++ trunk/Source/StructureMap/Pipeline/SmartInstance.cs 2008-08-19 18:03:10 UTC (rev 143) @@ -3,6 +3,7 @@ using System.Linq.Expressions; using StructureMap.Configuration.DSL.Expressions; using StructureMap.Graph; +using StructureMap.Interceptors; namespace StructureMap.Pipeline { @@ -14,11 +15,36 @@ { } - protected override SmartInstance<T> thisInstance + public SmartInstance<T> WithName(string instanceKey) { - get { return this; } + Name = instanceKey; + return this; } + public SmartInstance<T> OnCreation(Action<T> handler) + { + StartupInterceptor<T> interceptor = new StartupInterceptor<T>(handler); + Interceptor = interceptor; + + return this; + } + + public SmartInstance<T> EnrichWith(EnrichmentHandler<T> handler) + { + EnrichmentInterceptor<T> interceptor = new EnrichmentInterceptor<T>(handler); + Interceptor = interceptor; + + return this; + } + + public SmartInstance<T> EnrichWith<PLUGINTYPE>(EnrichmentHandler<PLUGINTYPE> handler) + { + EnrichmentInterceptor<PLUGINTYPE> interceptor = new EnrichmentInterceptor<PLUGINTYPE>(handler); + Interceptor = interceptor; + + return this; + } + protected override string getDescription() { return "Smart Instance for " + getConcreteType().FullName; Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/InterceptorTesting.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/InterceptorTesting.cs 2008-08-19 17:56:03 UTC (rev 142) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/InterceptorTesting.cs 2008-08-19 18:03:10 UTC (rev 143) @@ -42,7 +42,7 @@ _container = new Container(r => r.ForRequestedType<IService>().AddInstances(x => { x.OfConcreteType<ColorService>() - .OnCreation<ColorService>(s => _lastService = s) + .OnCreation(s => _lastService = s) .WithName("Intercepted") .WithProperty("color").EqualTo("Red"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
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. |
From: <jer...@us...> - 2008-09-14 22:14:22
|
Revision: 149 http://structuremap.svn.sourceforge.net/structuremap/?rev=149&view=rev Author: jeremydmiller Date: 2008-09-14 22:14:18 +0000 (Sun, 14 Sep 2008) Log Message: ----------- StructureMapConfiguration refactoring to start adding some defensive coding checks Modified Paths: -------------- trunk/Source/StructureMap/Configuration/ConfigurationParserBuilder.cs trunk/Source/StructureMap/Container.cs trunk/Source/StructureMap/ObjectFactory.cs trunk/Source/StructureMap/StructureMapConfiguration.cs trunk/Source/StructureMap.Testing/AlternativeConfigurationTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/AddInstanceTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/ConstructorExpressionTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryIntegratedTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/ScanAssembliesTester.cs trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs trunk/Source/StructureMap.Testing/StructureMapConfigurationTester.cs Modified: trunk/Source/StructureMap/Configuration/ConfigurationParserBuilder.cs =================================================================== --- trunk/Source/StructureMap/Configuration/ConfigurationParserBuilder.cs 2008-09-02 21:40:36 UTC (rev 148) +++ trunk/Source/StructureMap/Configuration/ConfigurationParserBuilder.cs 2008-09-14 22:14:18 UTC (rev 149) @@ -5,8 +5,17 @@ namespace StructureMap.Configuration { - public class ConfigurationParserBuilder + public interface IConfigurationParserBuilder { + bool UseAndEnforceExistenceOfDefaultFile { get; set; } + bool IgnoreDefaultFile { get; set; } + bool PullConfigurationFromAppConfig { get; set; } + void IncludeFile(string filename); + void IncludeNode(XmlNode node, string description); + } + + public class ConfigurationParserBuilder : IConfigurationParserBuilder + { private readonly GraphLog _log; private readonly List<string> _otherFiles = new List<string>(); private readonly List<ConfigurationParser> _parsers = new List<ConfigurationParser>(); Modified: trunk/Source/StructureMap/Container.cs =================================================================== --- trunk/Source/StructureMap/Container.cs 2008-09-02 21:40:36 UTC (rev 148) +++ trunk/Source/StructureMap/Container.cs 2008-09-14 22:14:18 UTC (rev 149) @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Text; +using StructureMap.Configuration; using StructureMap.Configuration.DSL; using StructureMap.Diagnostics; using StructureMap.Exceptions; @@ -12,6 +13,31 @@ namespace StructureMap { + public class ConfigurationExpression + { + private readonly List<Registry> _registries = new List<Registry>(); + private readonly List<ConfigurationParser> _parsers = new List<ConfigurationParser>(); + + internal ConfigurationExpression(PluginGraphBuilder builder) + { + } + + public void AddRegistry(Registry registry) + { + _registries.Add(registry); + } + + public void AddConfigurationFromXmlFile(string fileName) + { + throw new NotImplementedException(); + } + + internal PluginGraph BuildGraph() + { + throw new NotImplementedException(); + } + } + /// <summary> /// A collection of IInstanceFactory's. /// </summary> Modified: trunk/Source/StructureMap/ObjectFactory.cs =================================================================== --- trunk/Source/StructureMap/ObjectFactory.cs 2008-09-02 21:40:36 UTC (rev 148) +++ trunk/Source/StructureMap/ObjectFactory.cs 2008-09-14 22:14:18 UTC (rev 149) @@ -23,28 +23,25 @@ private static event Notify _notify; /// <summary> - /// Used for testing only (kills singletons). In non-test scenarios, use Reset() instead. - /// </summary> - public static void ReInitialize() - { - _profile = string.Empty; - _notify = null; - _manager = null; - } - - /// <summary> /// Restarts ObjectFactory and blows away all Singleton's and cached instances. Use with caution. /// </summary> public static void Reset() { - _manager = buildManager(); - - if (_notify != null) + lock (_lockObject) { - _notify(); + StructureMapConfiguration.Unseal(); + + _manager = null; + _profile = string.Empty; + + if (_notify != null) + { + _notify(); + } } } + /// <summary> /// Creates an instance of the concrete type specified. Dependencies are inferred from the constructor function of the type /// and automatically "filled" @@ -128,7 +125,7 @@ { if (_manager == null) { - Reset(); + _manager = buildManager(); } } } @@ -214,6 +211,7 @@ private static Container buildManager() { PluginGraph graph = StructureMapConfiguration.GetPluginGraph(); + StructureMapConfiguration.Seal(); Container container = new Container(graph); container.SetDefaultsToProfile(_profile); Modified: trunk/Source/StructureMap/StructureMapConfiguration.cs =================================================================== --- trunk/Source/StructureMap/StructureMapConfiguration.cs 2008-09-02 21:40:36 UTC (rev 148) +++ trunk/Source/StructureMap/StructureMapConfiguration.cs 2008-09-14 22:14:18 UTC (rev 149) @@ -19,36 +19,64 @@ private static List<Registry> _registries; private static Registry _registry; private static ConfigurationParserBuilder _parserBuilder; + private static bool _sealed = false; + static StructureMapConfiguration() { ResetAll(); } + private static IConfigurationParserBuilder parserBuilder + { + get + { + return _parserBuilder; + } + } + + private static Registry registry + { + get + { + return _registry; + } + } + /// <summary> /// Flag to enable or disable the usage of the default StructureMap.config /// If set to false, StructureMap will not look for a StructureMap.config file /// </summary> public static bool UseDefaultStructureMapConfigFile { - get { return _parserBuilder.UseAndEnforceExistenceOfDefaultFile; } - set { _parserBuilder.UseAndEnforceExistenceOfDefaultFile = value; } + get { return parserBuilder.UseAndEnforceExistenceOfDefaultFile; } + set { parserBuilder.UseAndEnforceExistenceOfDefaultFile = value; } } public static bool IgnoreStructureMapConfig { - get { return _parserBuilder.IgnoreDefaultFile; } - set { _parserBuilder.IgnoreDefaultFile = value; } + get { return parserBuilder.IgnoreDefaultFile; } + set { parserBuilder.IgnoreDefaultFile = value; } } public static bool PullConfigurationFromAppConfig { - get { return _parserBuilder.PullConfigurationFromAppConfig; } - set { _parserBuilder.PullConfigurationFromAppConfig = value; } + get { return parserBuilder.PullConfigurationFromAppConfig; } + set { parserBuilder.PullConfigurationFromAppConfig = value; } } + /// <summary> + /// Programmatically adds a <StructureMap> node containing Xml configuration + /// </summary> + /// <param name="node"></param> + /// <param name="description">A description of this node source for troubleshooting purposes</param> + public static void IncludeConfigurationFromNode(XmlNode node, string description) + { + parserBuilder.IncludeNode(node, string.Empty); + } + /// <summary> /// Returns the path to the StructureMap.config file /// </summary> @@ -78,6 +106,10 @@ /// </summary> public static void ResetAll() { + PluginCache.ResetAll(); + + _sealed = false; + _log = new GraphLog(); _parserBuilder = new ConfigurationParserBuilder(_log); _registry = new Registry(); @@ -87,18 +119,19 @@ IgnoreStructureMapConfig = false; PluginCache.ResetAll(); + ObjectFactory.Reset(); } public static void RegisterInterceptor(TypeInterceptor interceptor) { - _registry.RegisterInterceptor(interceptor); + registry.RegisterInterceptor(interceptor); } /// <summary> /// Builds a PluginGraph object for the current configuration. Used by ObjectFactory. /// </summary> /// <returns></returns> - public static PluginGraph GetPluginGraph() + internal static PluginGraph GetPluginGraph() { ConfigurationParser[] parsers = _parserBuilder.GetParsers(); @@ -112,26 +145,18 @@ /// <param name="filename"></param> public static void IncludeConfigurationFromFile(string filename) { - _parserBuilder.IncludeFile(filename); + parserBuilder.IncludeFile(filename); } - /// <summary> - /// Programmatically adds a <StructureMap> node containing Xml configuration - /// </summary> - /// <param name="node"></param> - /// <param name="description">A description of this node source for troubleshooting purposes</param> - public static void IncludeConfigurationFromNode(XmlNode node, string description) - { - _parserBuilder.IncludeNode(node, string.Empty); - } + /// <summary> /// Programmatically determine Assembly's to be scanned for attribute configuration /// </summary> /// <returns></returns> public static ScanAssembliesExpression ScanAssemblies() { - return new ScanAssembliesExpression(_registry); + return registry.ScanAssemblies(); } /// <summary> @@ -141,7 +166,7 @@ /// <returns></returns> public static CreatePluginFamilyExpression<PLUGINTYPE> BuildInstancesOf<PLUGINTYPE>() { - return _registry.BuildInstancesOf<PLUGINTYPE>(); + return registry.BuildInstancesOf<PLUGINTYPE>(); } /// <summary> @@ -151,12 +176,12 @@ /// <returns></returns> public static CreatePluginFamilyExpression<PLUGINTYPE> ForRequestedType<PLUGINTYPE>() { - return _registry.BuildInstancesOf<PLUGINTYPE>(); + return registry.BuildInstancesOf<PLUGINTYPE>(); } public static GenericFamilyExpression ForRequestedType(Type pluginType) { - return _registry.ForRequestedType(pluginType); + return registry.ForRequestedType(pluginType); } /// <summary> @@ -167,19 +192,19 @@ [Obsolete] public static Registry.ConfiguredInstanceExpression<T> AddInstanceOf<T>() { - return _registry.AddInstanceOf<T>(); + return registry.AddInstanceOf<T>(); } [Obsolete] public static void AddInstanceOf<T>(Func<T> func) { - _registry.AddInstanceOf<T>(new ConstructorInstance<T>(func)); + registry.AddInstanceOf<T>(new ConstructorInstance<T>(func)); } [Obsolete] public static void AddInstanceOf<T>(Instance instance) { - _registry.ForRequestedType<T>().AddInstance(instance); + registry.ForRequestedType<T>().AddInstance(instance); } @@ -193,30 +218,17 @@ [Obsolete] public static LiteralInstance AddInstanceOf<T>(T target) { - return _registry.AddInstanceOf(target); + return registry.AddInstanceOf(target); } /// <summary> - /// Adds a Prototype (GoF) instance of Type T. The actual prototype object must implement the - /// ICloneable interface. When this instance of T is requested, StructureMap will - /// return a cloned copy of the originally registered prototype object. - /// </summary> - /// <typeparam name="T"></typeparam> - /// <param name="prototype"></param> - /// <returns></returns> - public static PrototypeInstance AddPrototypeInstanceOf<T>(T prototype) - { - return _registry.AddPrototypeInstanceOf(prototype); - } - - /// <summary> /// Starts the definition of a configuration Profile. /// </summary> /// <param name="profileName"></param> /// <returns></returns> public static ProfileExpression CreateProfile(string profileName) { - return _registry.CreateProfile(profileName); + return registry.CreateProfile(profileName); } /// <summary> @@ -231,9 +243,18 @@ public static void TheDefaultProfileIs(string profileName) { - _registry.addExpression(graph => graph.ProfileManager.DefaultProfileName = profileName); + registry.addExpression(graph => graph.ProfileManager.DefaultProfileName = profileName); } + internal static void Seal() + { + _sealed = true; + } + + internal static void Unseal() + { + _sealed = false; + } } } \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/AlternativeConfigurationTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/AlternativeConfigurationTester.cs 2008-09-02 21:40:36 UTC (rev 148) +++ trunk/Source/StructureMap.Testing/AlternativeConfigurationTester.cs 2008-09-14 22:14:18 UTC (rev 149) @@ -16,7 +16,6 @@ { DataMother.BackupStructureMapConfig(); - ObjectFactory.ReInitialize(); StructureMapConfiguration.ResetAll(); DataMother.WriteDocument("Config1.xml"); DataMother.WriteDocument("Config2.xml"); @@ -27,9 +26,6 @@ public void TearDown() { StructureMapConfiguration.ResetAll(); - ObjectFactory.Reset(); - - DataMother.RestoreStructureMapConfig(); } @@ -51,7 +47,6 @@ StructureMapConfiguration.UseDefaultStructureMapConfigFile = true; StructureMapConfiguration.IncludeConfigurationFromNode(doc.DocumentElement, string.Empty); - ObjectFactory.Reset(); IPlug<string> service = ObjectFactory.GetInstance<IPlug<string>>(); Assert.IsNotNull(service); @@ -60,19 +55,11 @@ [Test] public void NotTheDefault() { - try - { - StructureMapConfiguration.UseDefaultStructureMapConfigFile = false; - StructureMapConfiguration.IgnoreStructureMapConfig = true; - StructureMapConfiguration.IncludeConfigurationFromFile("Config1.xml"); - ObjectFactory.Reset(); + StructureMapConfiguration.UseDefaultStructureMapConfigFile = false; + StructureMapConfiguration.IgnoreStructureMapConfig = true; + StructureMapConfiguration.IncludeConfigurationFromFile("Config1.xml"); - assertTheDefault("Orange"); - } - finally - { - DataMother.RestoreStructureMapConfig(); - } + assertTheDefault("Orange"); } [Test] Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/AddInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/AddInstanceTester.cs 2008-09-02 21:40:36 UTC (rev 148) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/AddInstanceTester.cs 2008-09-14 22:14:18 UTC (rev 149) @@ -62,12 +62,14 @@ [Test] public void AddInstanceAndOverrideTheConcreteTypeForADependency() { - IContainer manager = new Container( - registry => registry.AddInstanceOf<Rule>().UsingConcreteType<WidgetRule>().WithName("AWidgetRule") - .Child<IWidget>().IsConcreteType<AWidget>()); + IContainer container = new Container( + registry => registry.AddInstanceOf<Rule>().UsingConcreteType<WidgetRule>() + .WithName("AWidgetRule") + .Child<IWidget>().IsConcreteType<AWidget>()); - var rule = (WidgetRule) manager.GetInstance<Rule>("AWidgetRule"); - Assert.IsInstanceOfType(typeof (AWidget), rule.Widget); + container.GetInstance<Rule>("AWidgetRule") + .IsType<WidgetRule>() + .Widget.IsType<AWidget>(); } [Test, Explicit] Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/ConstructorExpressionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/ConstructorExpressionTester.cs 2008-09-02 21:40:36 UTC (rev 148) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/ConstructorExpressionTester.cs 2008-09-14 22:14:18 UTC (rev 149) @@ -12,7 +12,6 @@ public void SetUp() { StructureMapConfiguration.ResetAll(); - ObjectFactory.Reset(); } #endregion Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryIntegratedTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryIntegratedTester.cs 2008-09-02 21:40:36 UTC (rev 148) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryIntegratedTester.cs 2008-09-14 22:14:18 UTC (rev 149) @@ -21,7 +21,6 @@ public void TearDown() { StructureMapConfiguration.ResetAll(); - ObjectFactory.Reset(); } #endregion @@ -32,8 +31,6 @@ StructureMapConfiguration.ResetAll(); StructureMapConfiguration.ScanAssemblies().IncludeAssemblyContainingType<RedGreenRegistry>(); - ObjectFactory.Reset(); - List<string> colors = new List<string>(); foreach (IWidget widget in ObjectFactory.GetAllInstances<IWidget>()) { Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/ScanAssembliesTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/ScanAssembliesTester.cs 2008-09-02 21:40:36 UTC (rev 148) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/ScanAssembliesTester.cs 2008-09-14 22:14:18 UTC (rev 149) @@ -14,14 +14,13 @@ [SetUp] public void SetUp() { - ObjectFactory.Reset(); + StructureMapConfiguration.ResetAll(); } [TearDown] public void TearDown() { StructureMapConfiguration.ResetAll(); - ObjectFactory.Reset(); } #endregion Modified: trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs 2008-09-02 21:40:36 UTC (rev 148) +++ trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs 2008-09-14 22:14:18 UTC (rev 149) @@ -18,7 +18,7 @@ [SetUp] public void SetUp() { - ObjectFactory.ReInitialize(); + ObjectFactory.Reset(); StructureMapConfiguration.ResetAll(); } Modified: trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs 2008-09-02 21:40:36 UTC (rev 148) +++ trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs 2008-09-14 22:14:18 UTC (rev 149) @@ -21,7 +21,6 @@ public void TearDown() { StructureMapConfiguration.ResetAll(); - ObjectFactory.Reset(); } #endregion Modified: trunk/Source/StructureMap.Testing/StructureMapConfigurationTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/StructureMapConfigurationTester.cs 2008-09-02 21:40:36 UTC (rev 148) +++ trunk/Source/StructureMap.Testing/StructureMapConfigurationTester.cs 2008-09-14 22:14:18 UTC (rev 149) @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Xml; using NUnit.Framework; using StructureMap.Configuration; @@ -18,7 +19,6 @@ public void SetUp() { DataMother.RestoreStructureMapConfig(); - ObjectFactory.ReInitialize(); StructureMapConfiguration.ResetAll(); } @@ -47,7 +47,6 @@ [Test] public void Ignore_the_StructureMap_config_file_even_if_it_exists() { - StructureMapConfiguration.ResetAll(); StructureMapConfiguration.IgnoreStructureMapConfig = true; PluginGraph graph = StructureMapConfiguration.GetPluginGraph(); @@ -93,7 +92,6 @@ [Test] public void StructureMap_functions_without_StructureMapconfig_file_in_the_default_mode() { - StructureMapConfiguration.ResetAll(); DataMother.RemoveStructureMapConfig(); PluginGraph graph = StructureMapConfiguration.GetPluginGraph(); @@ -114,7 +112,6 @@ [Test] public void Use_the_StructureMap_config_file_if_it_exists() { - StructureMapConfiguration.ResetAll(); DataMother.RestoreStructureMapConfig(); PluginGraph graph = StructureMapConfiguration.GetPluginGraph(); @@ -124,7 +121,6 @@ [Test(Description = "Guid test based on problems encountered by Paul Segaro. See http://groups.google.com/group/structuremap-users/browse_thread/thread/34ddaf549ebb14f7?hl=en")] public void TheDefaultInstanceIsALambdaForGuidNewGuid() { - StructureMapConfiguration.ResetAll(); StructureMapConfiguration.IgnoreStructureMapConfig = true; StructureMapConfiguration.ForRequestedType<Guid>().TheDefaultIs(() => Guid.NewGuid()); @@ -135,7 +131,6 @@ [Test(Description = "Guid test based on problems encountered by Paul Segaro. See http://groups.google.com/group/structuremap-users/browse_thread/thread/34ddaf549ebb14f7?hl=en")] public void TheDefaultInstance_has_a_dependency_upon_a_Guid_NewGuid_lambda_generated_instance() { - StructureMapConfiguration.ResetAll(); StructureMapConfiguration.IgnoreStructureMapConfig = true; StructureMapConfiguration.ForRequestedType<Guid>().TheDefaultIs(() => Guid.NewGuid()); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2008-09-15 01:47:41
|
Revision: 150 http://structuremap.svn.sourceforge.net/structuremap/?rev=150&view=rev Author: jeremydmiller Date: 2008-09-15 01:47:31 +0000 (Mon, 15 Sep 2008) Log Message: ----------- ObjectFactory.Initialize Modified Paths: -------------- trunk/Source/StructureMap/Container.cs trunk/Source/StructureMap/ObjectFactory.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs trunk/Source/StructureMap/StructureMapConfiguration.cs trunk/Source/StructureMap/StructureMapException.resx trunk/Source/StructureMap.Testing/Configuration/DSL/DeepInstanceTester.cs trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs trunk/Source/StructureMap.Testing/ObjectFactoryTester.cs trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj trunk/Source/StructureMap.Testing/StructureMapConfigurationTester.cs Added Paths: ----------- trunk/Source/StructureMap.Testing/ObjectFactoryInitializeTester.cs trunk/Source/StructureMap.Testing/StructureMapConfigurationDefensiveChecksTester.cs Modified: trunk/Source/StructureMap/Container.cs =================================================================== --- trunk/Source/StructureMap/Container.cs 2008-09-14 22:14:18 UTC (rev 149) +++ trunk/Source/StructureMap/Container.cs 2008-09-15 01:47:31 UTC (rev 150) @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Text; +using System.Xml; using StructureMap.Configuration; using StructureMap.Configuration.DSL; using StructureMap.Diagnostics; @@ -13,15 +14,53 @@ namespace StructureMap { - public class ConfigurationExpression + public class InitializationExpression : ConfigurationExpression { + internal InitializationExpression() + { + _parserBuilder.IgnoreDefaultFile = false; + DefaultProfileName = string.Empty; + } + + public bool UseDefaultStructureMapConfigFile + { + set { _parserBuilder.UseAndEnforceExistenceOfDefaultFile = value; } + } + + public bool IgnoreStructureMapConfig + { + set { _parserBuilder.IgnoreDefaultFile = value; } + } + + public bool PullConfigurationFromAppConfig + { + set { _parserBuilder.PullConfigurationFromAppConfig = value; } + } + + public string DefaultProfileName { get; set; } + } + + public class ConfigurationExpression : Registry + { + protected readonly GraphLog _log = new GraphLog(); private readonly List<Registry> _registries = new List<Registry>(); - private readonly List<ConfigurationParser> _parsers = new List<ConfigurationParser>(); + protected readonly ConfigurationParserBuilder _parserBuilder; - internal ConfigurationExpression(PluginGraphBuilder builder) + internal ConfigurationExpression() { + _parserBuilder = new ConfigurationParserBuilder(_log); + _parserBuilder.IgnoreDefaultFile = true; + _parserBuilder.PullConfigurationFromAppConfig = false; + + _registries.Add(this); + } + public void AddRegistry<T>() where T : Registry, new() + { + AddRegistry(new T()); + } + public void AddRegistry(Registry registry) { _registries.Add(registry); @@ -29,12 +68,29 @@ public void AddConfigurationFromXmlFile(string fileName) { - throw new NotImplementedException(); + _parserBuilder.IncludeFile(fileName); } + public void AddConfigurationFromNode(XmlNode node) + { + _parserBuilder.IncludeNode(node, "Xml configuration"); + } + + public bool IncludeConfigurationFromConfigFile + { + set + { + _parserBuilder.UseAndEnforceExistenceOfDefaultFile = value; + } + + } + internal PluginGraph BuildGraph() { - throw new NotImplementedException(); + var parsers = _parserBuilder.GetParsers(); + PluginGraphBuilder builder = new PluginGraphBuilder(parsers, _registries.ToArray(), _log); + + return builder.Build(); } } @@ -46,12 +102,12 @@ private InterceptorLibrary _interceptorLibrary; private PipelineGraph _pipelineGraph; - public Container(Action<Registry> action) + public Container(Action<ConfigurationExpression> action) { - Registry registry = new Registry(); - action(registry); + ConfigurationExpression expression = new ConfigurationExpression(); + action(expression); - construct(registry.Build()); + construct(expression.BuildGraph()); } public Container(Registry registry) : this(registry.Build()) Modified: trunk/Source/StructureMap/ObjectFactory.cs =================================================================== --- trunk/Source/StructureMap/ObjectFactory.cs 2008-09-14 22:14:18 UTC (rev 149) +++ trunk/Source/StructureMap/ObjectFactory.cs 2008-09-15 01:47:31 UTC (rev 150) @@ -41,7 +41,22 @@ } } + public static void Initialize(Action<InitializationExpression> action) + { + lock (typeof(ObjectFactory)) + { + InitializationExpression expression = new InitializationExpression(); + action(expression); + var graph = expression.BuildGraph(); + StructureMapConfiguration.Seal(); + + _manager = new Container(graph); + Profile = expression.DefaultProfileName; + } + } + + /// <summary> /// Creates an instance of the concrete type specified. Dependencies are inferred from the constructor function of the type /// and automatically "filled" Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs 2008-09-14 22:14:18 UTC (rev 149) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs 2008-09-15 01:47:31 UTC (rev 150) @@ -29,30 +29,6 @@ } - protected void mergeIntoThis(ConfiguredInstance instance) - { - _pluggedType = instance._pluggedType; - - foreach (KeyValuePair<string, string> pair in instance._properties) - { - if (!_properties.ContainsKey(pair.Key)) - { - _properties.Add(pair.Key, pair.Value); - } - } - - foreach (KeyValuePair<string, Instance> pair in instance._children) - { - if (!_children.ContainsKey(pair.Key)) - { - _children.Add(pair.Key, pair.Value); - } - } - - _arrays = instance._arrays; - } - - protected override void preprocess(PluginFamily family) { Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs 2008-09-14 22:14:18 UTC (rev 149) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs 2008-09-15 01:47:31 UTC (rev 150) @@ -1,11 +1,21 @@ using System; +using System.Collections; using System.Collections.Generic; using StructureMap.Graph; namespace StructureMap.Pipeline { - public abstract class ConfiguredInstanceBase<T> : Instance, IConfiguredInstance, IStructuredInstance + public interface Copyable { + Type PluggedType { get; } + Dictionary<string, string> Properties { get; } + Dictionary<string, Instance> Children { get; } + Dictionary<string, Instance[]> Arrays { get; } + } + + + public abstract class ConfiguredInstanceBase<T> : Instance, IConfiguredInstance, IStructuredInstance, Copyable + { protected Dictionary<string, Instance> _children = new Dictionary<string, Instance>(); protected Dictionary<string, string> _properties = new Dictionary<string, string>(); protected Dictionary<string, Instance[]> _arrays = new Dictionary<string, Instance[]>(); @@ -35,6 +45,8 @@ get { return _pluggedType; } } + + Instance IStructuredInstance.GetChild(string name) { return _children[name]; @@ -196,5 +208,48 @@ { setChildArray(name, children); } + + protected void mergeIntoThis(Copyable instance) + { + _pluggedType = instance.PluggedType; + + foreach (KeyValuePair<string, string> pair in instance.Properties) + { + if (!_properties.ContainsKey(pair.Key)) + { + _properties.Add(pair.Key, pair.Value); + } + } + + foreach (KeyValuePair<string, Instance> pair in instance.Children) + { + if (!_children.ContainsKey(pair.Key)) + { + _children.Add(pair.Key, pair.Value); + } + } + + _arrays = instance.Arrays; + } + + Type Copyable.PluggedType + { + get { return _pluggedType; } + } + + Dictionary<string, string> Copyable.Properties + { + get { return _properties; } + } + + Dictionary<string, Instance> Copyable.Children + { + get { return _children; } + } + + Dictionary<string, Instance[]> Copyable.Arrays + { + get { return _arrays; } + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs 2008-09-14 22:14:18 UTC (rev 149) +++ trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs 2008-09-15 01:47:31 UTC (rev 150) @@ -81,7 +81,7 @@ args.Configure(this); _args = args; - ConfiguredInstance defaultConfiguration = defaultInstance as ConfiguredInstance; + Copyable defaultConfiguration = defaultInstance as Copyable; if (defaultConfiguration != null) { mergeIntoThis(defaultConfiguration); Modified: trunk/Source/StructureMap/StructureMapConfiguration.cs =================================================================== --- trunk/Source/StructureMap/StructureMapConfiguration.cs 2008-09-14 22:14:18 UTC (rev 149) +++ trunk/Source/StructureMap/StructureMapConfiguration.cs 2008-09-15 01:47:31 UTC (rev 150) @@ -12,6 +12,7 @@ namespace StructureMap { + [Obsolete("Please put configuration into Registry classes and use the ObjectFactory.Initialize() method for configuring the container")] public static class StructureMapConfiguration { private const string CONFIG_FILE_NAME = "StructureMap.config"; @@ -27,10 +28,19 @@ ResetAll(); } + private static void assertIsNotSealed() + { + if (_sealed) + { + throw new StructureMapException(50); + } + } + private static IConfigurationParserBuilder parserBuilder { get { + assertIsNotSealed(); return _parserBuilder; } } @@ -39,6 +49,7 @@ { get { + assertIsNotSealed(); return _registry; } } @@ -81,7 +92,7 @@ /// Returns the path to the StructureMap.config file /// </summary> /// <returns></returns> - public static string GetStructureMapConfigurationPath() + internal static string GetStructureMapConfigurationPath() { string basePath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase; string configPath = Path.Combine(basePath, CONFIG_FILE_NAME); @@ -189,19 +200,16 @@ /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> - [Obsolete] public static Registry.ConfiguredInstanceExpression<T> AddInstanceOf<T>() { return registry.AddInstanceOf<T>(); } - [Obsolete] public static void AddInstanceOf<T>(Func<T> func) { registry.AddInstanceOf<T>(new ConstructorInstance<T>(func)); } - [Obsolete] public static void AddInstanceOf<T>(Instance instance) { registry.ForRequestedType<T>().AddInstance(instance); @@ -215,7 +223,6 @@ /// <typeparam name="T"></typeparam> /// <param name="target"></param> /// <returns></returns> - [Obsolete] public static LiteralInstance AddInstanceOf<T>(T target) { return registry.AddInstanceOf(target); @@ -238,6 +245,7 @@ /// <param name="registry"></param> public static void AddRegistry(Registry registry) { + assertIsNotSealed(); _registries.Add(registry); } Modified: trunk/Source/StructureMap/StructureMapException.resx =================================================================== --- trunk/Source/StructureMap/StructureMapException.resx 2008-09-14 22:14:18 UTC (rev 149) +++ trunk/Source/StructureMap/StructureMapException.resx 2008-09-15 01:47:31 UTC (rev 150) @@ -256,4 +256,7 @@ <data name="280" xml:space="preserve"> <value>Requested Profile {0} cannot be found</value> </data> + <data name="50" xml:space="preserve"> + <value>StructureMapConfiguration cannot be used after ObjectFactory is initialized</value> + </data> </root> \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/DeepInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/DeepInstanceTester.cs 2008-09-14 22:14:18 UTC (rev 149) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/DeepInstanceTester.cs 2008-09-15 01:47:31 UTC (rev 150) @@ -11,7 +11,7 @@ { private readonly Thing _prototype = new Thing(4, "Jeremy", .333, new WidgetRule(new ColorWidget("yellow"))); - private void assertThingMatches(Action<Registry> action) + private void assertThingMatches(Action<ConfigurationExpression> action) { IContainer manager = new Container(action); Thing actual = manager.GetInstance<Thing>(); Modified: trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs 2008-09-14 22:14:18 UTC (rev 149) +++ trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs 2008-09-15 01:47:31 UTC (rev 150) @@ -143,6 +143,25 @@ } [Test] + public void NowDoItWithObjectFactoryItself_with_new_API() + { + ObjectFactory.Initialize(x => + { + x.ForRequestedType<ExplicitTarget>().TheDefault.Is.OfConcreteType<ExplicitTarget>() + .CtorDependency<IProvider>().Is(child => child.OfConcreteType<RedProvider>()) + .WithCtorArg("name").EqualTo("Jeremy"); + }); + + // Get the ExplicitTarget without setting an explicit arg for IProvider + ObjectFactory.GetInstance<ExplicitTarget>().Provider.IsType<RedProvider>(); + + // Now, set the explicit arg for IProvider + var theBlueProvider = new BlueProvider(); + ObjectFactory.With<IProvider>(theBlueProvider).GetInstance<ExplicitTarget>() + .Provider.ShouldBeTheSameAs(theBlueProvider); + } + + [Test] public void OverrideAPrimitiveWithObjectFactory() { StructureMapConfiguration.ForRequestedType<ExplicitTarget>().TheDefaultIs( Added: trunk/Source/StructureMap.Testing/ObjectFactoryInitializeTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/ObjectFactoryInitializeTester.cs (rev 0) +++ trunk/Source/StructureMap.Testing/ObjectFactoryInitializeTester.cs 2008-09-15 01:47:31 UTC (rev 150) @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Xml; +using NUnit.Framework; +using StructureMap.Configuration; +using StructureMap.Graph; +using StructureMap.Testing.GenericWidgets; +using StructureMap.Testing.TestData; +using StructureMap.Testing.Widget3; + +namespace StructureMap.Testing +{ + [TestFixture] + public class ObjectFactoryInitializeTester + { + private static XmlNode createNodeFromText(string outerXml) + { + XmlDocument document = new XmlDocument(); + document.LoadXml(outerXml); + return document.DocumentElement; + } + + + + [Test] + public void PullConfigurationFromTheAppConfig() + { + ObjectFactory.Initialize(x => + { + x.UseDefaultStructureMapConfigFile = false; + x.PullConfigurationFromAppConfig = true; + }); + + ObjectFactory.GetInstance<IThing<string, bool>>() + .IsType<ColorThing<string, bool>>().Color.ShouldEqual("Cornflower"); + } + + + [Test] + public void StructureMap_functions_without_StructureMapconfig_file_in_the_default_mode() + { + DataMother.RemoveStructureMapConfig(); + + ObjectFactory.Initialize(x => { }); + } + + + + [Test] + public void TheDefaultNameIs_should_set_the_default_profile_name() + { + string theDefaultProfileName = "the default profile"; + + ObjectFactory.Initialize(x => + { + x.CreateProfile(theDefaultProfileName).For<IGateway>().Use(() => null); + + x.IgnoreStructureMapConfig = true; + x.DefaultProfileName = theDefaultProfileName; + }); + + ObjectFactory.Profile.ShouldEqual(theDefaultProfileName); + } + + + } +} Modified: trunk/Source/StructureMap.Testing/ObjectFactoryTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/ObjectFactoryTester.cs 2008-09-14 22:14:18 UTC (rev 149) +++ trunk/Source/StructureMap.Testing/ObjectFactoryTester.cs 2008-09-15 01:47:31 UTC (rev 150) @@ -17,41 +17,12 @@ [SetUp] public void SetUp() { - _event = new ManualResetEvent(false); - DataMother.WriteDocument("FullTesting.XML"); + DataMother.RestoreStructureMapConfig(); + ObjectFactory.Initialize(x => x.UseDefaultStructureMapConfigFile = true); } #endregion - private ManualResetEvent _event; - - private void markDone() - { - _event.Set(); - } - - private void modifyXml(string Color) - { - XmlDocument doc = new XmlDocument(); - doc.Load("StructureMap.config"); - XmlNode node = - doc.DocumentElement.SelectSingleNode("PluginFamily[@Type='StructureMap.Testing.Widget.Rule']"); - node.Attributes["DefaultKey"].Value = Color; - doc.Save("StructureMap.config"); - } - - private void timeout() - { - Thread thread = new Thread(signal); - thread.Start(); - } - - private void signal() - { - Thread.Sleep(500); - _event.Set(); - } - [Test] public void SmokeTestGetAllInstances() { Modified: trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj =================================================================== --- trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2008-09-14 22:14:18 UTC (rev 149) +++ trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2008-09-15 01:47:31 UTC (rev 150) @@ -349,6 +349,7 @@ <Compile Include="InstanceMementoInstanceCreationTester.cs" /> <Compile Include="MementoTester.cs" /> <Compile Include="MergingTester.cs" /> + <Compile Include="ObjectFactoryInitializeTester.cs" /> <Compile Include="ObjectFactoryTester.cs"> <SubType>Code</SubType> </Compile> @@ -381,6 +382,7 @@ </Compile> <Compile Include="SpecificationExtensions.cs" /> <Compile Include="StructureMapConfigCreator.cs" /> + <Compile Include="StructureMapConfigurationDefensiveChecksTester.cs" /> <Compile Include="StructureMapConfigurationTester.cs" /> <Compile Include="TestData\DataMother.cs"> <SubType>Code</SubType> Added: trunk/Source/StructureMap.Testing/StructureMapConfigurationDefensiveChecksTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/StructureMapConfigurationDefensiveChecksTester.cs (rev 0) +++ trunk/Source/StructureMap.Testing/StructureMapConfigurationDefensiveChecksTester.cs 2008-09-15 01:47:31 UTC (rev 150) @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using StructureMap.Testing.Widget3; + +namespace StructureMap.Testing +{ + [TestFixture] + public class StructureMapConfigurationDefensiveChecksTester + { + private void shouldThrowExceptionWhenSealed(Action action) + { + StructureMapConfiguration.ResetAll(); + StructureMapConfiguration.Seal(); + + try + { + action(); + Assert.Fail("Should have thrown exception"); + } + catch (StructureMapException ex) + { + ex.ErrorCode.ShouldEqual(50); + } + } + + [Test] + public void Ensure_defensive_check_is_always_thrown_when_StructureMapConfiguration_is_sealed() + { + shouldThrowExceptionWhenSealed(() => StructureMapConfiguration.AddInstanceOf<IGateway>()); + shouldThrowExceptionWhenSealed(() => StructureMapConfiguration.AddRegistry(null)); + shouldThrowExceptionWhenSealed(() => StructureMapConfiguration.BuildInstancesOf<IGateway>()); + shouldThrowExceptionWhenSealed(() => StructureMapConfiguration.CreateProfile("something")); + shouldThrowExceptionWhenSealed(() => StructureMapConfiguration.ForRequestedType(typeof(IGateway))); + shouldThrowExceptionWhenSealed(() => StructureMapConfiguration.IgnoreStructureMapConfig = true); + shouldThrowExceptionWhenSealed(() => StructureMapConfiguration.IncludeConfigurationFromFile("something")); + shouldThrowExceptionWhenSealed(() => StructureMapConfiguration.IncludeConfigurationFromNode(null, null)); + shouldThrowExceptionWhenSealed(() => StructureMapConfiguration.PullConfigurationFromAppConfig = true); + shouldThrowExceptionWhenSealed(() => StructureMapConfiguration.RegisterInterceptor(null)); + shouldThrowExceptionWhenSealed(() => StructureMapConfiguration.ScanAssemblies()); + shouldThrowExceptionWhenSealed(() => StructureMapConfiguration.TheDefaultProfileIs("something")); + shouldThrowExceptionWhenSealed(() => StructureMapConfiguration.UseDefaultStructureMapConfigFile = true); + } + } +} Modified: trunk/Source/StructureMap.Testing/StructureMapConfigurationTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/StructureMapConfigurationTester.cs 2008-09-14 22:14:18 UTC (rev 149) +++ trunk/Source/StructureMap.Testing/StructureMapConfigurationTester.cs 2008-09-15 01:47:31 UTC (rev 150) @@ -48,10 +48,7 @@ public void Ignore_the_StructureMap_config_file_even_if_it_exists() { StructureMapConfiguration.IgnoreStructureMapConfig = true; - - PluginGraph graph = StructureMapConfiguration.GetPluginGraph(); - - Assert.AreEqual(0, graph.FamilyCount); + StructureMapConfiguration.GetPluginGraph().FamilyCount.ShouldEqual(0); } @@ -61,9 +58,8 @@ StructureMapConfiguration.UseDefaultStructureMapConfigFile = false; StructureMapConfiguration.PullConfigurationFromAppConfig = true; - ColorThing<string, bool> thing = - (ColorThing<string, bool>) ObjectFactory.GetInstance<IThing<string, bool>>(); - Assert.AreEqual("Cornflower", thing.Color, "Cornflower is the color from the App.config file"); + ObjectFactory.GetInstance<IThing<string, bool>>() + .IsType<ColorThing<string, bool>>().Color.ShouldEqual("Cornflower"); } @@ -94,7 +90,7 @@ { DataMother.RemoveStructureMapConfig(); - PluginGraph graph = StructureMapConfiguration.GetPluginGraph(); + StructureMapConfiguration.GetPluginGraph().ShouldNotBeNull(); } [Test] @@ -106,16 +102,14 @@ StructureMapConfiguration.TheDefaultProfileIs(theDefaultProfileName); PluginGraph graph = StructureMapConfiguration.GetPluginGraph(); - Assert.AreEqual(theDefaultProfileName, graph.ProfileManager.DefaultProfileName); + graph.ProfileManager.DefaultProfileName.ShouldEqual(theDefaultProfileName); } [Test] public void Use_the_StructureMap_config_file_if_it_exists() { DataMother.RestoreStructureMapConfig(); - - PluginGraph graph = StructureMapConfiguration.GetPluginGraph(); - Assert.IsTrue(graph.FamilyCount > 0); + StructureMapConfiguration.GetPluginGraph().FamilyCount.ShouldBeGreaterThan(0); } [Test(Description = "Guid test based on problems encountered by Paul Segaro. See http://groups.google.com/group/structuremap-users/browse_thread/thread/34ddaf549ebb14f7?hl=en")] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2008-09-16 11:52:01
|
Revision: 151 http://structuremap.svn.sourceforge.net/structuremap/?rev=151&view=rev Author: jeremydmiller Date: 2008-09-16 18:51:53 +0000 (Tue, 16 Sep 2008) Log Message: ----------- killing off some warnings, and redoing some diagnostics after the StructureMapConfiguration refactoring Modified Paths: -------------- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs trunk/Source/StructureMap/Configuration/DSL/Registry.cs trunk/Source/StructureMap/Container.cs trunk/Source/StructureMap/Diagnostics/DoctorRunner.cs trunk/Source/StructureMap/IContainer.cs trunk/Source/StructureMap/ObjectFactory.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs trunk/Source/StructureMap/StructureMap.csproj trunk/Source/StructureMap/StructureMapConfiguration.cs trunk/Source/StructureMap/StructureMapException.resx trunk/Source/StructureMap.Testing/BuildSessionTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/AddInstanceTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/AddTypesTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/DeepInstanceTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/InjectArrayTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryTester.cs trunk/Source/StructureMap.Testing/Diagnostics/DoctorTester.cs trunk/Source/StructureMap.Testing/Diagnostics/ValidationBuildSessionTester.cs trunk/Source/StructureMap.Testing/Graph/ContainerTester.cs trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs trunk/Source/StructureMap.Testing/Graph/EnumerationTester.cs trunk/Source/StructureMap.Testing/Graph/FullStackFacadeTester.cs trunk/Source/StructureMap.Testing/Graph/Interceptors/CompoundInterceptorTester.cs trunk/Source/StructureMap.Testing/Graph/Interceptors/InterceptorLibraryTester.cs trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs trunk/Source/StructureMap.Testing/Graph/PluginTester.cs trunk/Source/StructureMap.Testing/Pipeline/BuildStrategiesTester.cs trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/DefaultInstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/InstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs trunk/Source/StructureMap.Testing/Pipeline/ProfileManagerTester.cs trunk/Source/StructureMap.Testing/Pipeline/ProfileTester.cs trunk/Source/StructureMap.Testing/Pipeline/ReferencedInstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/StubBuildSession.cs trunk/Source/StructureMap.Testing/PipelineGraphTester.cs trunk/Source/StructureMap.Testing/StructureMapConfigurationDefensiveChecksTester.cs trunk/Source/StructureMap.Testing/StructureMapConfigurationTester.cs trunk/Source/StructureMap.Testing.Widget5/StructureMap.Testing.Widget5.csproj trunk/Source/StructureMap.Testing.Widget5/WidgetRegistry.cs Added Paths: ----------- trunk/Source/StructureMap/ConfigurationExpression.cs trunk/Source/StructureMap/InitializationExpression.cs Property Changed: ---------------- trunk/Source/StructureMap.Testing.Widget5/ Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2008-09-15 01:47:31 UTC (rev 150) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2008-09-16 18:51:53 UTC (rev 151) @@ -151,25 +151,10 @@ return this; } - [Obsolete("Kill!")] - public CreatePluginFamilyExpression<PLUGINTYPE> AddConcreteType<CONCRETETYPE>() - { - return AddConcreteType<CONCRETETYPE>(Guid.NewGuid().ToString()); - } - [Obsolete("Kill!")] - public CreatePluginFamilyExpression<PLUGINTYPE> AddConcreteType<CONCRETETYPE>(string instanceName) + public CreatePluginFamilyExpression<PLUGINTYPE> AddConcreteType<PLUGGEDTYPE>() { - ExpressionValidator.ValidatePluggabilityOf(typeof (CONCRETETYPE)).IntoPluginType(typeof (PLUGINTYPE)); - - _alterations.Add( - family => - { - ConfiguredInstance instance = new ConfiguredInstance(typeof(CONCRETETYPE)).WithName(instanceName); - family.AddInstance(instance); - } - ); - + _alterations.Add(family => family.AddInstance(new SmartInstance<PLUGGEDTYPE>())); return this; } @@ -193,33 +178,5 @@ return new InstanceExpression<PLUGINTYPE>(i => TheDefaultIs(i)); } } - - [Obsolete("Kill!")] - public CreatePluginFamilyExpression<PLUGINTYPE> TheDefaultIs(PLUGINTYPE @object) - { - return TheDefaultIs(new LiteralInstance(@object)); - } - - [Obsolete("Kill!")] - public CreatePluginFamilyExpression<PLUGINTYPE> TheDefaultIs(Func<PLUGINTYPE> func) - { - ConstructorInstance<PLUGINTYPE> instance = new ConstructorInstance<PLUGINTYPE>(func); - return TheDefaultIs(instance); - } - - [Obsolete("Kill!")] - public CreatePluginFamilyExpression<PLUGINTYPE> AddInstance(PLUGINTYPE @object) - { - LiteralInstance instance = new LiteralInstance(@object); - return AddInstance(instance); - } - - [Obsolete("Kill!")] - public CreatePluginFamilyExpression<PLUGINTYPE> AddInstance(Func<PLUGINTYPE> func) - { - ConstructorInstance<PLUGINTYPE> instance = new ConstructorInstance<PLUGINTYPE>(func); - return AddInstance(instance); - } - } } \ No newline at end of file Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs 2008-09-15 01:47:31 UTC (rev 150) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs 2008-09-16 18:51:53 UTC (rev 151) @@ -62,5 +62,10 @@ { return returnInstance(new ConstructorInstance<T>(func)); } + + public PrototypeInstance PrototypeOf(T template) + { + return returnInstance(new PrototypeInstance((ICloneable) template)); + } } } Modified: trunk/Source/StructureMap/Configuration/DSL/Registry.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2008-09-15 01:47:31 UTC (rev 150) +++ trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2008-09-16 18:51:53 UTC (rev 151) @@ -83,80 +83,16 @@ return graph; } - /// <summary> - /// Starts an instance definition of type T - /// </summary> - /// <typeparam name="PLUGINTYPE"></typeparam> - /// <returns></returns> - [Obsolete("Like to go away")] - public ConfiguredInstanceExpression<PLUGINTYPE> AddInstanceOf<PLUGINTYPE>() + public IsExpression<T> InstanceOf<T>() { - return new ConfiguredInstanceExpression<PLUGINTYPE>(this); - } - - [Obsolete("Like to get rid of this")] - public class ConfiguredInstanceExpression<PLUGINTYPE> - { - private readonly Registry _registry; - - public ConfiguredInstanceExpression(Registry registry) + return new InstanceExpression<T>(instance => { - _registry = registry; - } - - - public ConfiguredInstance UsingConcreteType<T>() - { - ConfiguredInstance instance = new ConfiguredInstance(typeof(T)); - _registry.addExpression(graph => graph.FindFamily(typeof(PLUGINTYPE)).AddInstance(instance)); - - return instance; - } + Action<PluginGraph> alteration = g => g.FindFamily(typeof (T)).AddInstance(instance); + _actions.Add(alteration); + }); } - /// <summary> - /// Registers a preconfigured instance - /// </summary> - /// <typeparam name="PLUGINTYPE"></typeparam> - /// <param name="target"></param> - /// <returns></returns> - [Obsolete("Like to get rid of this")] - public LiteralInstance AddInstanceOf<PLUGINTYPE>(PLUGINTYPE target) - { - LiteralInstance literal = new LiteralInstance(target); - _actions.Add(graph => graph.FindFamily(typeof (PLUGINTYPE)).AddInstance(literal)); - - return literal; - } - - /// <summary> - /// Add a preconfigured instance as a Prototype - /// </summary> - /// <typeparam name="PLUGINTYPE"></typeparam> - /// <param name="prototype"></param> - /// <returns></returns> - [Obsolete("Like to get rid of this")] - public PrototypeInstance AddPrototypeInstanceOf<PLUGINTYPE>(PLUGINTYPE prototype) - { - PrototypeInstance instance = new PrototypeInstance((ICloneable) prototype); - _actions.Add(graph => graph.FindFamily(typeof (PLUGINTYPE)).AddInstance(instance)); - - return instance; - } - - /// <summary> - /// convenience method for a UserControl - /// </summary> - /// <param name="url"></param> - /// <returns></returns> - [Obsolete("Like to get rid of this")] - public static UserControlInstance LoadUserControlFrom(string url) - { - return new UserControlInstance(url); - } - - /// <summary> /// Starts the definition of a new Profile /// </summary> /// <param name="profileName"></param> @@ -246,5 +182,7 @@ PluginCache.AddFilledType(typeof(PLUGINTYPE)); return ForRequestedType<PLUGINTYPE>(); } + + } } \ No newline at end of file Added: trunk/Source/StructureMap/ConfigurationExpression.cs =================================================================== --- trunk/Source/StructureMap/ConfigurationExpression.cs (rev 0) +++ trunk/Source/StructureMap/ConfigurationExpression.cs 2008-09-16 18:51:53 UTC (rev 151) @@ -0,0 +1,63 @@ +using System.Collections.Generic; +using System.Xml; +using StructureMap.Configuration; +using StructureMap.Configuration.DSL; +using StructureMap.Diagnostics; +using StructureMap.Graph; + +namespace StructureMap +{ + public class ConfigurationExpression : Registry + { + protected readonly GraphLog _log = new GraphLog(); + private readonly List<Registry> _registries = new List<Registry>(); + protected readonly ConfigurationParserBuilder _parserBuilder; + + internal ConfigurationExpression() + { + _parserBuilder = new ConfigurationParserBuilder(_log); + _parserBuilder.IgnoreDefaultFile = true; + _parserBuilder.PullConfigurationFromAppConfig = false; + + _registries.Add(this); + + } + + public void AddRegistry<T>() where T : Registry, new() + { + AddRegistry(new T()); + } + + public void AddRegistry(Registry registry) + { + _registries.Add(registry); + } + + public void AddConfigurationFromXmlFile(string fileName) + { + _parserBuilder.IncludeFile(fileName); + } + + public void AddConfigurationFromNode(XmlNode node) + { + _parserBuilder.IncludeNode(node, "Xml configuration"); + } + + public bool IncludeConfigurationFromConfigFile + { + set + { + _parserBuilder.UseAndEnforceExistenceOfDefaultFile = value; + } + + } + + internal PluginGraph BuildGraph() + { + var parsers = _parserBuilder.GetParsers(); + PluginGraphBuilder builder = new PluginGraphBuilder(parsers, _registries.ToArray(), _log); + + return builder.Build(); + } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap/Container.cs =================================================================== --- trunk/Source/StructureMap/Container.cs 2008-09-15 01:47:31 UTC (rev 150) +++ trunk/Source/StructureMap/Container.cs 2008-09-16 18:51:53 UTC (rev 151) @@ -3,8 +3,6 @@ using System.Collections.Generic; using System.Diagnostics; using System.Text; -using System.Xml; -using StructureMap.Configuration; using StructureMap.Configuration.DSL; using StructureMap.Diagnostics; using StructureMap.Exceptions; @@ -14,86 +12,6 @@ namespace StructureMap { - public class InitializationExpression : ConfigurationExpression - { - internal InitializationExpression() - { - _parserBuilder.IgnoreDefaultFile = false; - DefaultProfileName = string.Empty; - } - - public bool UseDefaultStructureMapConfigFile - { - set { _parserBuilder.UseAndEnforceExistenceOfDefaultFile = value; } - } - - public bool IgnoreStructureMapConfig - { - set { _parserBuilder.IgnoreDefaultFile = value; } - } - - public bool PullConfigurationFromAppConfig - { - set { _parserBuilder.PullConfigurationFromAppConfig = value; } - } - - public string DefaultProfileName { get; set; } - } - - public class ConfigurationExpression : Registry - { - protected readonly GraphLog _log = new GraphLog(); - private readonly List<Registry> _registries = new List<Registry>(); - protected readonly ConfigurationParserBuilder _parserBuilder; - - internal ConfigurationExpression() - { - _parserBuilder = new ConfigurationParserBuilder(_log); - _parserBuilder.IgnoreDefaultFile = true; - _parserBuilder.PullConfigurationFromAppConfig = false; - - _registries.Add(this); - - } - - public void AddRegistry<T>() where T : Registry, new() - { - AddRegistry(new T()); - } - - public void AddRegistry(Registry registry) - { - _registries.Add(registry); - } - - public void AddConfigurationFromXmlFile(string fileName) - { - _parserBuilder.IncludeFile(fileName); - } - - public void AddConfigurationFromNode(XmlNode node) - { - _parserBuilder.IncludeNode(node, "Xml configuration"); - } - - public bool IncludeConfigurationFromConfigFile - { - set - { - _parserBuilder.UseAndEnforceExistenceOfDefaultFile = value; - } - - } - - internal PluginGraph BuildGraph() - { - var parsers = _parserBuilder.GetParsers(); - PluginGraphBuilder builder = new PluginGraphBuilder(parsers, _registries.ToArray(), _log); - - return builder.Build(); - } - } - /// <summary> /// A collection of IInstanceFactory's. /// </summary> @@ -101,6 +19,7 @@ { private InterceptorLibrary _interceptorLibrary; private PipelineGraph _pipelineGraph; + private PluginGraph _pluginGraph; public Container(Action<ConfigurationExpression> action) { @@ -118,6 +37,11 @@ { } + public PluginGraph PluginGraph + { + get { return _pluginGraph; } + } + /// <summary> /// Constructor to create an Container /// </summary> @@ -138,6 +62,7 @@ pluginGraph.Seal(); } + _pluginGraph = pluginGraph; pluginGraph.Log.AssertFailures(); _pipelineGraph = new PipelineGraph(pluginGraph); Modified: trunk/Source/StructureMap/Diagnostics/DoctorRunner.cs =================================================================== --- trunk/Source/StructureMap/Diagnostics/DoctorRunner.cs 2008-09-15 01:47:31 UTC (rev 150) +++ trunk/Source/StructureMap/Diagnostics/DoctorRunner.cs 2008-09-16 18:51:53 UTC (rev 151) @@ -1,14 +1,11 @@ using System; +using StructureMap.Exceptions; using StructureMap.Graph; namespace StructureMap.Diagnostics { public class DoctorRunner : MarshalByRefObject { - public DoctorRunner() - { - } - public override object InitializeLifetimeService() { return null; @@ -16,11 +13,11 @@ public DoctorReport RunReport(string bootstrapperTypeName) { - var report = new DoctorReport(){Result = DoctorResult.Success}; - + var report = new DoctorReport {Result = DoctorResult.Success}; + IBootstrapper bootstrapper; - try + try { var path = new TypePath(bootstrapperTypeName); Type bootstrapperType = path.FindType(); @@ -37,7 +34,29 @@ try { bootstrapper.BootstrapStructureMap(); + + PluginGraph graph = ObjectFactory.PluginGraph; + + if (graph.Log.ErrorCount > 0) + { + report.ErrorMessages = graph.Log.BuildFailureMessage(); + report.Result = DoctorResult.ConfigurationErrors; + } + else + { + writeConfigurationAndValidate(report, graph); + } + + + return report; } + catch (StructureMapConfigurationException ex) + { + report.ErrorMessages = ex.Message; + report.Result = DoctorResult.ConfigurationErrors; + + return report; + } catch (Exception ex) { report.Result = DoctorResult.BootstrapperFailure; @@ -46,21 +65,7 @@ return report; } - PluginGraph graph = StructureMapConfiguration.GetPluginGraph(); - if (graph.Log.ErrorCount > 0) - { - report.ErrorMessages = graph.Log.BuildFailureMessage(); - report.Result = DoctorResult.ConfigurationErrors; - } - else - { - writeConfigurationAndValidate(report, graph); - } - - - - return report; } private void writeConfigurationAndValidate(DoctorReport report, PluginGraph graph) @@ -69,7 +74,7 @@ var writer = new WhatDoIHaveWriter(pipelineGraph); report.WhatDoIHave = writer.GetText(); - ValidationBuildSession session = new ValidationBuildSession(pipelineGraph, graph.InterceptorLibrary); + var session = new ValidationBuildSession(pipelineGraph, graph.InterceptorLibrary); session.PerformValidations(); if (session.HasBuildErrors()) @@ -78,7 +83,7 @@ } else if (session.HasValidationErrors()) { - report.Result = DoctorResult.ValidationErrors; + report.Result = DoctorResult.ValidationErrors; } if (!session.Success) Modified: trunk/Source/StructureMap/IContainer.cs =================================================================== --- trunk/Source/StructureMap/IContainer.cs 2008-09-15 01:47:31 UTC (rev 150) +++ trunk/Source/StructureMap/IContainer.cs 2008-09-16 18:51:53 UTC (rev 151) @@ -2,6 +2,7 @@ using System.Collections; using System.Collections.Generic; using StructureMap.Configuration.DSL; +using StructureMap.Graph; using StructureMap.Pipeline; namespace StructureMap @@ -67,5 +68,6 @@ IExplicitProperty With(string argName); void AssertConfigurationIsValid(); object GetInstance(Type type, ExplicitArguments args); + PluginGraph PluginGraph { get; } } } \ No newline at end of file Added: trunk/Source/StructureMap/InitializationExpression.cs =================================================================== --- trunk/Source/StructureMap/InitializationExpression.cs (rev 0) +++ trunk/Source/StructureMap/InitializationExpression.cs 2008-09-16 18:51:53 UTC (rev 151) @@ -0,0 +1,28 @@ +namespace StructureMap +{ + public class InitializationExpression : ConfigurationExpression + { + internal InitializationExpression() + { + _parserBuilder.IgnoreDefaultFile = false; + DefaultProfileName = string.Empty; + } + + public bool UseDefaultStructureMapConfigFile + { + set { _parserBuilder.UseAndEnforceExistenceOfDefaultFile = value; } + } + + public bool IgnoreStructureMapConfig + { + set { _parserBuilder.IgnoreDefaultFile = value; } + } + + public bool PullConfigurationFromAppConfig + { + set { _parserBuilder.PullConfigurationFromAppConfig = value; } + } + + public string DefaultProfileName { get; set; } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap/ObjectFactory.cs =================================================================== --- trunk/Source/StructureMap/ObjectFactory.cs 2008-09-15 01:47:31 UTC (rev 150) +++ trunk/Source/StructureMap/ObjectFactory.cs 2008-09-16 18:51:53 UTC (rev 151) @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Security.Permissions; using StructureMap.Configuration.DSL; +using StructureMap.Diagnostics; using StructureMap.Graph; using StructureMap.Pipeline; @@ -17,7 +18,7 @@ public class ObjectFactory { private static readonly object _lockObject = new object(); - private static IContainer _manager; + private static IContainer _container; private static string _profile = string.Empty; private static event Notify _notify; @@ -31,7 +32,7 @@ { StructureMapConfiguration.Unseal(); - _manager = null; + _container = null; _profile = string.Empty; if (_notify != null) @@ -51,7 +52,7 @@ var graph = expression.BuildGraph(); StructureMapConfiguration.Seal(); - _manager = new Container(graph); + _container = new Container(graph); Profile = expression.DefaultProfileName; } } @@ -134,18 +135,18 @@ { get { - if (_manager == null) + if (_container == null) { lock (_lockObject) { - if (_manager == null) + if (_container == null) { - _manager = buildManager(); + _container = buildManager(); } } } - return _manager; + return _container; } } @@ -164,12 +165,15 @@ get { return _profile; } } + internal static PluginGraph PluginGraph + { + get { return container.PluginGraph; } + } - internal static void ReplaceManager(IContainer container) { - _manager = container; + _container = container; } public static void Configure(Action<Registry> configure) Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs 2008-09-15 01:47:31 UTC (rev 150) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs 2008-09-16 18:51:53 UTC (rev 151) @@ -28,15 +28,17 @@ protected ConfiguredInstanceBase(Type pluggedType, string name) { - // TODO -- need defensive check HERE! - //throw new NotImplementedException("Need to check for public constructor HERE!"); - _pluggedType = pluggedType; Name = name; } protected ConfiguredInstanceBase(Type pluggedType) : this(pluggedType, Guid.NewGuid().ToString()) { + if (pluggedType != null) + if (pluggedType.IsAbstract || pluggedType.IsInterface) + { + throw new StructureMapException(25); + } } Modified: trunk/Source/StructureMap/StructureMap.csproj =================================================================== --- trunk/Source/StructureMap/StructureMap.csproj 2008-09-15 01:47:31 UTC (rev 150) +++ trunk/Source/StructureMap/StructureMap.csproj 2008-09-16 18:51:53 UTC (rev 151) @@ -389,6 +389,7 @@ <Link>Properties\structuremap.snk</Link> </None> <None Include="ConfigurationClasses.cd" /> + <Compile Include="ConfigurationExpression.cs" /> <Compile Include="Configuration\DictionaryReader.cs" /> <Compile Include="Configuration\DSL\Expressions\InstanceExpression.cs" /> <Compile Include="Configuration\ITypeReader.cs" /> @@ -405,6 +406,7 @@ <Compile Include="Graph\ITypeScanner.cs" /> <Compile Include="Graph\PluginCache.cs" /> <Compile Include="IBootstrapper.cs" /> + <Compile Include="InitializationExpression.cs" /> <Compile Include="Pipeline\BuildFrame.cs" /> <Compile Include="Pipeline\BuildStack.cs" /> <Compile Include="Pipeline\ConfiguredInstanceBase.cs" /> Modified: trunk/Source/StructureMap/StructureMapConfiguration.cs =================================================================== --- trunk/Source/StructureMap/StructureMapConfiguration.cs 2008-09-15 01:47:31 UTC (rev 150) +++ trunk/Source/StructureMap/StructureMapConfiguration.cs 2008-09-16 18:51:53 UTC (rev 151) @@ -195,16 +195,6 @@ return registry.ForRequestedType(pluginType); } - /// <summary> - /// Adds a new configured instance of Type T - /// </summary> - /// <typeparam name="T"></typeparam> - /// <returns></returns> - public static Registry.ConfiguredInstanceExpression<T> AddInstanceOf<T>() - { - return registry.AddInstanceOf<T>(); - } - public static void AddInstanceOf<T>(Func<T> func) { registry.AddInstanceOf<T>(new ConstructorInstance<T>(func)); @@ -217,18 +207,6 @@ /// <summary> - /// Adds a preconfigured instance of Type T to StructureMap. When this instance is requested, - /// StructureMap will always return the original object. - /// </summary> - /// <typeparam name="T"></typeparam> - /// <param name="target"></param> - /// <returns></returns> - public static LiteralInstance AddInstanceOf<T>(T target) - { - return registry.AddInstanceOf(target); - } - - /// <summary> /// Starts the definition of a configuration Profile. /// </summary> /// <param name="profileName"></param> Modified: trunk/Source/StructureMap/StructureMapException.resx =================================================================== --- trunk/Source/StructureMap/StructureMapException.resx 2008-09-15 01:47:31 UTC (rev 150) +++ trunk/Source/StructureMap/StructureMapException.resx 2008-09-16 18:51:53 UTC (rev 151) @@ -259,4 +259,7 @@ <data name="50" xml:space="preserve"> <value>StructureMapConfiguration cannot be used after ObjectFactory is initialized</value> </data> + <data name="125" xml:space="preserve"> + <value>Cannot plug an abstract class or an interface</value> + </data> </root> \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/BuildSessionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/BuildSessionTester.cs 2008-09-15 01:47:31 UTC (rev 150) +++ trunk/Source/StructureMap.Testing/BuildSessionTester.cs 2008-09-16 18:51:53 UTC (rev 151) @@ -77,11 +77,14 @@ [Test] public void If_no_child_array_is_explicitly_defined_return_all_instances() { - IContainer manager = new Container(registry => + IContainer manager = new Container(r => { - registry.AddInstanceOf<IWidget>(new ColorWidget("Red")); - registry.AddInstanceOf<IWidget>(new ColorWidget("Blue")); - registry.AddInstanceOf<IWidget>(new ColorWidget("Green")); + r.ForRequestedType<IWidget>().AddInstances(x => + { + x.Object(new ColorWidget("Red")); + x.Object(new ColorWidget("Blue")); + x.Object(new ColorWidget("Green")); + }); }); WidgetHolder holder = manager.GetInstance<WidgetHolder>(); Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/AddInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/AddInstanceTester.cs 2008-09-15 01:47:31 UTC (rev 150) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/AddInstanceTester.cs 2008-09-16 18:51:53 UTC (rev 151) @@ -19,25 +19,25 @@ registry.ScanAssemblies().IncludeAssemblyContainingType<ColorWidget>(); // Add an instance with properties - registry.AddInstanceOf<IWidget>() - .UsingConcreteType<ColorWidget>() + registry.InstanceOf<IWidget>() + .Is.OfConcreteType<ColorWidget>() .WithName("DarkGreen") .WithProperty("color").EqualTo("DarkGreen"); // Add an instance by specifying the ConcreteKey - registry.AddInstanceOf<IWidget>() - .UsingConcreteType<ColorWidget>() + registry.InstanceOf<IWidget>() + .Is.OfConcreteType<ColorWidget>() .WithName("Purple") .WithProperty("color").EqualTo("Purple"); // Pull a property from the App config - registry.AddInstanceOf<IWidget>() - .UsingConcreteType<ColorWidget>() + registry.InstanceOf<IWidget>() + .Is.OfConcreteType<ColorWidget>() .WithName("AppSetting") .WithProperty("color").EqualToAppSetting("Color"); - registry.AddInstanceOf<IWidget>().UsingConcreteType<AWidget>(); + registry.InstanceOf<IWidget>().Is.OfConcreteType<AWidget>(); }); } @@ -63,9 +63,9 @@ public void AddInstanceAndOverrideTheConcreteTypeForADependency() { IContainer container = new Container( - registry => registry.AddInstanceOf<Rule>().UsingConcreteType<WidgetRule>() + registry => registry.InstanceOf<Rule>().Is.OfConcreteType<WidgetRule>() .WithName("AWidgetRule") - .Child<IWidget>().IsConcreteType<AWidget>()); + .CtorDependency<IWidget>().Is(i => i.OfConcreteType<AWidget>())); container.GetInstance<Rule>("AWidgetRule") .IsType<WidgetRule>() @@ -84,47 +84,29 @@ public void SimpleCaseWithNamedInstance() { container = new Container( - registry => registry.AddInstanceOf<IWidget>().UsingConcreteType<AWidget>().WithName("MyInstance")); + registry => registry.InstanceOf<IWidget>().Is.OfConcreteType<AWidget>().WithName("MyInstance")); var widget = (AWidget) container.GetInstance<IWidget>("MyInstance"); Assert.IsNotNull(widget); } - [Test] - public void temp() - { - IContainer container = new Container(registry => - { - registry.AddInstanceOf<Rule>().UsingConcreteType<ARule>().WithName("Alias"); - // Add an instance by specifying the ConcreteKey - registry.AddInstanceOf<IWidget>() - .UsingConcreteType<ColorWidget>() - .WithName("Purple") - .WithProperty("color").EqualTo("Purple"); - - // Specify a new Instance, override a dependency with a named instance - registry.AddInstanceOf<Rule>().UsingConcreteType<WidgetRule>().WithName("RuleThatUsesMyInstance") - .Child<IWidget>("widget").IsNamedInstance("Purple"); - }); - } - [Test] public void SpecifyANewInstanceOverrideADependencyWithANamedInstance() { container = new Container(registry => { - registry.AddInstanceOf<Rule>().UsingConcreteType<ARule>().WithName("Alias"); + registry.InstanceOf<Rule>().Is.OfConcreteType<ARule>().WithName("Alias"); // Add an instance by specifying the ConcreteKey - registry.AddInstanceOf<IWidget>() - .UsingConcreteType<ColorWidget>() + registry.InstanceOf<IWidget>() + .Is.OfConcreteType<ColorWidget>() .WithName("Purple") .WithProperty("color").EqualTo("Purple"); // Specify a new Instance, override a dependency with a named instance - registry.AddInstanceOf<Rule>().UsingConcreteType<WidgetRule>().WithName("RuleThatUsesMyInstance") - .Child<IWidget>("widget").IsNamedInstance("Purple"); + registry.InstanceOf<Rule>().Is.OfConcreteType<WidgetRule>().WithName("RuleThatUsesMyInstance") + .CtorDependency<IWidget>("widget").Is(x => x.References("Purple")); }); Assert.IsInstanceOfType(typeof (ARule), container.GetInstance<Rule>("Alias")); @@ -141,14 +123,11 @@ string instanceKey = "OrangeWidgetRule"; IContainer manager = new Container( - registry => registry.AddInstanceOf<Rule>().UsingConcreteType<WidgetRule>().WithName(instanceKey) - .Child<IWidget>().Is( - Instance<ColorWidget>() - .WithProperty("color").EqualTo("Orange") - .WithName("Orange") - )); + registry => registry.InstanceOf<Rule>().Is.OfConcreteType<WidgetRule>().WithName(instanceKey) + .CtorDependency<IWidget>().Is(i => i.OfConcreteType<ColorWidget>().WithCtorArg("color").EqualTo("Orange").WithName("Orange")) + + ); - var rule = (WidgetRule) manager.GetInstance<Rule>(instanceKey); var widget = (ColorWidget) rule.Widget; Assert.AreEqual("Orange", widget.Color); @@ -164,7 +143,7 @@ container = new Container( - registry => registry.AddPrototypeInstanceOf<IWidget>(theWidget).WithName("Jeremy")); + registry => registry.InstanceOf<IWidget>().Is.PrototypeOf(theWidget).WithName("Jeremy")); var widget1 = (CloneableWidget) container.GetInstance<IWidget>("Jeremy"); var widget2 = (CloneableWidget) container.GetInstance<IWidget>("Jeremy"); @@ -187,7 +166,7 @@ var julia = new CloneableWidget("Julia"); container = - new Container(registry => registry.AddInstanceOf<IWidget>(julia).WithName("Julia")); + new Container(registry => registry.InstanceOf<IWidget>().Is.Object(julia).WithName("Julia")); var widget1 = (CloneableWidget) container.GetInstance<IWidget>("Julia"); var widget2 = (CloneableWidget) container.GetInstance<IWidget>("Julia"); @@ -199,6 +178,7 @@ } } + public class WidgetRule : Rule { Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/AddTypesTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/AddTypesTester.cs 2008-09-15 01:47:31 UTC (rev 150) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/AddTypesTester.cs 2008-09-16 18:51:53 UTC (rev 151) @@ -1,6 +1,5 @@ using System.Collections.Generic; using NUnit.Framework; -using StructureMap.Configuration.DSL; namespace StructureMap.Testing.Configuration.DSL { @@ -30,15 +29,17 @@ [Test] public void A_concrete_type_is_available_by_name_when_it_is_added_by_the_shorthand_mechanism() { - IContainer manager = new Container(registry => registry.ForRequestedType<IAddTypes>() - .AddConcreteType<RedAddTypes>("Red") - .AddConcreteType<GreenAddTypes>("Green") - .AddConcreteType<BlueAddTypes>("Blue") - .AddConcreteType<PurpleAddTypes>()); + IContainer container = new Container(r => r.ForRequestedType<IAddTypes>().AddInstances(x => + { + x.OfConcreteType<RedAddTypes>().WithName("Red"); + x.OfConcreteType<GreenAddTypes>().WithName("Green"); + x.OfConcreteType<BlueAddTypes>().WithName("Blue"); + x.OfConcreteType<PurpleAddTypes>(); + })); - Assert.IsInstanceOfType(typeof (RedAddTypes), manager.GetInstance<IAddTypes>("Red")); - Assert.IsInstanceOfType(typeof (GreenAddTypes), manager.GetInstance<IAddTypes>("Green")); - Assert.IsInstanceOfType(typeof (BlueAddTypes), manager.GetInstance<IAddTypes>("Blue")); + container.GetInstance<IAddTypes>("Red").IsType<RedAddTypes>(); + container.GetInstance<IAddTypes>("Green").IsType<GreenAddTypes>(); + container.GetInstance<IAddTypes>("Blue").IsType<BlueAddTypes>(); } [Test] @@ -58,11 +59,15 @@ [Test] public void Make_sure_that_we_dont_double_dip_instances_when_we_register_a_type_with_a_name() { - IContainer manager = new Container(registry => registry.ForRequestedType<IAddTypes>() - .AddConcreteType<RedAddTypes>("Red") - .AddConcreteType<GreenAddTypes>() - .AddConcreteType<BlueAddTypes>("Blue") - .AddConcreteType<PurpleAddTypes>()); + IContainer manager = new Container(r => + r.ForRequestedType<IAddTypes>().AddInstances(x => + { + x.OfConcreteType<GreenAddTypes>(); + x.OfConcreteType<BlueAddTypes>(); + x.OfConcreteType<PurpleAddTypes>(); + x.OfConcreteType<PurpleAddTypes>().WithName("Purple"); + }) + ); IList<IAddTypes> instances = manager.GetAllInstances<IAddTypes>(); Assert.AreEqual(4, instances.Count); Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs 2008-09-15 01:47:31 UTC (rev 150) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs 2008-09-16 18:51:53 UTC (rev 151) @@ -40,7 +40,7 @@ { Container manager = new Container( - registry => registry.ForRequestedType<IWidget>().AddInstance(delegate { return new AWidget(); })); + r => r.InstanceOf<IWidget>().Is.ConstructedBy(() => new AWidget())); Assert.IsInstanceOfType(typeof (AWidget), manager.GetAllInstances<IWidget>()[0]); } @@ -51,7 +51,7 @@ AWidget aWidget = new AWidget(); Container manager = - new Container(registry => registry.ForRequestedType<IWidget>().AddInstance(aWidget)); + new Container(registry => registry.InstanceOf<IWidget>().Is.Object(aWidget)); Assert.IsInstanceOfType(typeof (AWidget), manager.GetAllInstances<IWidget>()[0]); } @@ -70,7 +70,7 @@ public void AddInstanceWithNameOnlyAddsOneInstanceToStructureMap() { IContainer manager = - new Container(registry => registry.AddInstanceOf<Something>().UsingConcreteType<RedSomething>().WithName("Red")); + new Container(registry => registry.InstanceOf<Something>().Is.OfConcreteType<RedSomething>().WithName("Red")); IList<Something> instances = manager.GetAllInstances<Something>(); Assert.AreEqual(1, instances.Count); } @@ -189,7 +189,7 @@ { Container manager = new Container( - registry => registry.ForRequestedType<IWidget>().TheDefaultIs(delegate { return new AWidget(); })); + registry => registry.ForRequestedType<IWidget>().TheDefault.Is.ConstructedBy(() => new AWidget())); Assert.IsInstanceOfType(typeof (AWidget), manager.GetInstance<IWidget>()); } @@ -201,7 +201,7 @@ Container manager = new Container( - registry => registry.ForRequestedType<IWidget>().TheDefaultIs(aWidget)); + registry => registry.ForRequestedType<IWidget>().TheDefault.Is.Object(aWidget)); Assert.AreSame(aWidget, manager.GetInstance<IWidget>()); } @@ -237,7 +237,7 @@ { Container manager = new Container( - registry => registry.ForRequestedType<Guid>().TheDefaultIs(()=>Guid.NewGuid())); + registry => registry.ForRequestedType<Guid>().TheDefault.Is.ConstructedBy(()=>Guid.NewGuid())); Assert.IsInstanceOfType(typeof(Guid), manager.GetInstance<Guid>()); } Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/DeepInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/DeepInstanceTester.cs 2008-09-15 01:47:31 UTC (rev 150) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/DeepInstanceTester.cs 2008-09-16 18:51:53 UTC (rev 151) @@ -86,23 +86,21 @@ { assertThingMatches(registry => { - registry.AddInstanceOf<IWidget>() - .UsingConcreteType<ColorWidget>() + registry.InstanceOf<IWidget>() + .Is.OfConcreteType<ColorWidget>() .WithName("Yellow") .WithProperty("color").EqualTo("yellow"); - registry.AddInstanceOf<Rule>() - .UsingConcreteType<WidgetRule>() + registry.InstanceOf<Rule>() + .Is.OfConcreteType<WidgetRule>() .WithName("TheWidgetRule") - .Child<IWidget>().IsNamedInstance("Yellow"); + .CtorDependency<IWidget>().Is(i => i.References("Yellow")); - registry.BuildInstancesOf<Thing>().TheDefaultIs( - Instance<Thing>() - .WithProperty("average").EqualTo(.333) - .WithProperty("name").EqualTo("Jeremy") - .WithProperty("count").EqualTo(4) - .Child<Rule>().IsNamedInstance("TheWidgetRule") - ); + registry.BuildInstancesOf<Thing>().TheDefault.Is.OfConcreteType<Thing>() + .WithCtorArg("average").EqualTo(.333) + .WithCtorArg("name").EqualTo("Jeremy") + .WithCtorArg("count").EqualTo(4) + .CtorDependency<Rule>().Is(i => i.References("TheWidgetRule")); }); } Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/InjectArrayTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/InjectArrayTester.cs 2008-09-15 01:47:31 UTC (rev 150) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/InjectArrayTester.cs 2008-09-16 18:51:53 UTC (rev 151) @@ -148,12 +148,12 @@ [Test] public void PlaceMemberInArrayByReference() { - IContainer manager = new Container(registry => + IContainer manager = new Container(r => { - registry.AddInstanceOf<IHandler>().UsingConcreteType<Handler1>().WithName("One"); - registry.AddInstanceOf<IHandler>().UsingConcreteType<Handler2>().WithName("Two"); + r.InstanceOf<IHandler>().Is.OfConcreteType<Handler1>().WithName("One"); + r.InstanceOf<IHandler>().Is.OfConcreteType<Handler2>().WithName("Two"); - registry.ForRequestedType<Processor>() + r.ForRequestedType<Processor>() .TheDefaultIs( Instance<Processor>() .WithProperty("name").EqualTo("Jeremy") @@ -176,8 +176,8 @@ { IContainer manager = new Container(registry => { - registry.AddInstanceOf<IHandler>().UsingConcreteType<Handler1>().WithName("One"); - registry.AddInstanceOf<IHandler>().UsingConcreteType<Handler2>().WithName("Two"); + registry.InstanceOf<IHandler>().Is.OfConcreteType<Handler1>().WithName("One"); + registry.InstanceOf<IHandler>().Is.OfConcreteType<Handler2>().WithName("Two"); registry.ForRequestedType<Processor>().TheDefault.Is.OfConcreteType<Processor>() .WithCtorArg("name").EqualTo("Jeremy") @@ -221,6 +221,7 @@ { IContainer container = new Container(r => { +// ReSharper disable ConvertToLambdaExpression r.ForRequestedType<Processor>().TheDefault.Is.OfConcreteType<Processor>() .WithCtorArg("name").EqualTo("Jeremy") .TheArrayOf<IHandler>().Contains(x => @@ -229,8 +230,8 @@ x.OfConcreteType<Handler2>(); x.OfConcreteType<Handler3>(); }); +// ReSharper restore ConvertToLambdaExpression - int number = 0; }); var processor = container.GetInstance<Processor>(); Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryTester.cs 2008-09-15 01:47:31 UTC (rev 150) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryTester.cs 2008-09-16 18:51:53 UTC (rev 151) @@ -54,7 +54,7 @@ public void Can_add_an_instance_for_concrete_class_with_no_constructors() { Registry registry = new Registry(); - registry.ForRequestedType<ConcreteWithNoConstructor>().TheDefaultIs(() => ConcreteWithNoConstructor.Build()); + registry.ForRequestedType<ConcreteWithNoConstructor>().TheDefault.Is.ConstructedBy(() => ConcreteWithNoConstructor.Build()); Container container = new Container(registry); Modified: trunk/Source/StructureMap.Testing/Diagnostics/DoctorTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Diagnostics/DoctorTester.cs 2008-09-15 01:47:31 UTC (rev 150) +++ trunk/Source/StructureMap.Testing/Diagnostics/DoctorTester.cs 2008-09-16 18:51:53 UTC (rev 151) @@ -17,11 +17,9 @@ { private DoctorReport fetchReport<T>(string config) where T : IBootstrapper { - StructureMapConfiguration.ResetAll(); - StructureMapConfiguration.IgnoreStructureMapConfig = true; - var doctor = new Doctor {BinaryPath = Path.GetFullPath("."), BootstrapperType = typeof (T).AssemblyQualifiedName}; + if (!string.IsNullOrEmpty(config)) { var doc = new XmlDocument(); @@ -155,7 +153,7 @@ Assembly assembly = Assembly.GetExecutingAssembly(); foreach (Type type in assembly.GetExportedTypes()) { - if (typeof(IBootstrapper).IsAssignableFrom(type)) + if (typeof (IBootstrapper).IsAssignableFrom(type)) { Debug.WriteLine(TypePath.GetAssemblyQualifiedName(type)); } @@ -169,7 +167,7 @@ public void BootstrapStructureMap() { - StructureMapConfiguration.AddInstanceOf<IWidget>(new ConfiguredInstance(typeof(ColorRule))); + StructureMapConfiguration.AddInstanceOf<IWidget>(new ConfiguredInstance(typeof (ColorRule))); } #endregion @@ -181,8 +179,12 @@ public void BootstrapStructureMap() { - StructureMapConfiguration.IgnoreStructureMapConfig = true; - StructureMapConfiguration.AddInstanceOf(new DoctorTester.ClassThatFails()); + ObjectFactory.Initialize(x => + { + x.IgnoreStructureMapConfig = true; + + x.BuildInstancesOf<DoctorTester.ClassThatFails>().TheDefaultIsConcreteType<DoctorTester.ClassThatFails>(); + }); } #endregion @@ -208,9 +210,15 @@ public void BootstrapStructureMap() { - Instance bad = RegistryExpressions.ConstructedBy<IWidget>(() => { throw new NotImplementedException(); }); + ObjectFactory.Initialize(x => + { + x.InstanceOf<IWidget>().Is.ConstructedBy(() => + { + throw new NotImplementedException(); + }); + }); - StructureMapConfiguration.AddInstanceOf<IWidget>(bad); + } #endregion @@ -223,7 +231,7 @@ public void BootstrapStructureMap() { StructureMapConfiguration.IgnoreStructureMapConfig = true; - StructureMapConfiguration.BuildInstancesOf<IWidget>().TheDefaultIs(new ColorWidget("Red")); + StructureMapConfiguration.BuildInstancesOf<IWidget>().TheDefault.Is.Object(new ColorWidget("Red")); } #endregion Modified: trunk/Source/StructureMap.Testing/Diagnostics/ValidationBuildSessionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Diagnostics/ValidationBuildSessionTester.cs 2008-09-15 01:47:31 UTC (rev 150) +++ trunk/Source/StructureMap.Testing/Diagnostics/ValidationBuildSessionTester.cs 2008-09-16 18:51:53 UTC (rev 151) @@ -61,7 +61,7 @@ { ValidationBuildSession session = validatedSession( - registry => registry.AddInstanceOf<IWidget>(new ColorWidget("Red"))); + r => r.InstanceOf<IWidget>().Is.Object(new ColorWidget("Red"))); Assert.AreEqual(0, session.BuildErrors.Length); } @@ -122,7 +122,7 @@ { ValidationBuildSession session = validatedSession( - registry => registry.AddInstanceOf<IWidget>(new ColorWidget("Red"))); + registry => registry.InstanceOf<IWidget>().Is.Object(new ColorWidget("Red"))); Assert.AreEqual(0, session.ValidationErrors.Length); } Modified: trunk/Source/StructureMap.Testing/Graph/ContainerTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/ContainerTester.cs 2008-09-15 01:47:31 UTC (rev 150) +++ trunk/Source/StructureMap.Testing/Graph/ContainerTester.cs 2008-09-16 18:51:53 UTC (rev 151) @@ -33,11 +33,11 @@ private void addColorMemento(string Color) { - _manager.Configure(registry => + _manager.Configure(r => { - registry.AddInstanceOf<Rule>().UsingConcreteType<ColorRule>().WithProperty("color").EqualTo(Color).WithName(Color); - registry.AddInstanceOf<IWidget>().UsingConcreteType<ColorWidget>().WithProperty("color").EqualTo(Color).WithName(Color); - registry.AddInstanceOf<WidgetMaker>().UsingConcreteType<ColorWidgetMaker>().WithProperty("color").EqualTo(Color).WithName(Color); + r.InstanceOf<Rule>().Is.OfConcreteType<ColorRule>().WithCtorArg("color").EqualTo(Color).WithName(Color); + r.InstanceOf<IWidget>().Is.OfConcreteType<ColorWidget>().WithCtorArg("color").EqualTo(Color).WithName(Color); + r.InstanceOf<WidgetMaker>().Is.OfConcreteType<ColorWidgetMaker>().WithCtorArg("color").EqualTo(Color).WithName(Color); }); } Modified: trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs 2008-09-15 01:47:31 UTC (rev 150) +++ trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs 2008-09-16 18:51:53 UTC (rev 151) @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using NUnit.Framework; -using StructureMap.Configuration.DSL; using StructureMap.Graph; using StructureMap.Pipeline; using StructureMap.Testing.Pipeline; @@ -18,7 +17,6 @@ [SetUp] public void SetUp() { - ObjectFactory.Reset(); StructureMapConfiguration.ResetAll(); } @@ -30,11 +28,90 @@ private IInstanceFactory getISomethingFactory() { - PluginFamily family = new PluginFamily(typeof (ISomething)); + var family = new PluginFamily(typeof (ISomething)); return new InstanceFactory(family); } + public interface IService<T> + { + } + + public class Service1<T> : IService<T> + { + } + + public class Service2<T> : IService<T> + { + } + + public class Service3<T> : IService<T> + { + } + + [PluginFamily("Default")] + public interface IThingy + { + } + + [Pluggable("Default")] + public class TheThingy : IThingy + { + } + + + public class TheWidget : IWidget + { + #region IWidget Members + + public void DoSomething() + { + throw new NotImplementedException(); + } + + #endregion + } + [Test] + public void Add_an_assembly_in_the_Configure() + { + var container = new Container(); + container.Configure(registry => { registry.ScanAssemblies().IncludeTheCallingAssembly(); }); + + Assert.IsInstanceOfType(typeof (TheThingy), container.GetInstance<IThingy>()); + } + + [Test] + public void Add_an_assembly_on_the_fly_and_pick_up_plugins() + { + var container = new Container(); + container.Configure( + registry => { registry.ScanAssemblies().IncludeTheCallingAssembly().AddAllTypesOf<IWidget>(); }); + + IList<IWidget> instances = container.GetAllInstances<IWidget>(); + bool found = false; + foreach (IWidget widget in instances) + { + found |= widget.GetType().Equals(typeof (TheWidget)); + } + + Assert.IsTrue(found); + } + + [Test] + public void Add_generic_stuff_in_configure() + { + var container = new Container(); + container.Configure(registry => + { + registry.ForRequestedType(typeof (IService<>)) + .AddConcreteType(typeof (Service1<>)) + .AddConcreteType(typeof (Service2<>)); + }); + + Assert.AreEqual(2, container.GetAllInstances<IService<string>>().Count); + } + + [Test] public void AddANewDefaultTypeForAPluginTypeThatAlreadyExists() { StructureMapConfiguration.BuildInstancesOf<ISomething>().TheDefaultIsConcreteType<SomethingTwo>(); @@ -55,7 +132,7 @@ [Test] public void AddInstanceFromObjectFactory() { - SomethingOne one = new SomethingOne(); + var one = new SomethingOne(); ObjectFactory.Inject<ISomething>(one); Assert.AreSame(one, ObjectFactory.GetInstance<ISomething>()); @@ -65,10 +142,13 @@ public void AddInstanceToInstanceManagerWhenTheInstanceFactoryDoesNotExist() { IContainer container = new Container(new PluginGraph()); - container.Configure(registry => + container.Configure(r => { - registry.AddInstanceOf(_red).WithName("Red"); - registry.AddInstanceOf(_blue).WithName("Blue"); + r.ForRequestedType<IService>().AddInstances(x => + { + x.Object(_red).WithName("Red"); + x.Object(_blue).WithName("Blue"); + }); }); Assert.AreSame(_red, container.GetInstance(typeof (IService), "Red")); @@ -79,10 +159,13 @@ [Test] public void AddNamedInstanceByType() { - ObjectFactory.Configure(registry => + ObjectFactory.Configure(r => { - registry.AddInstanceOf<ISomething>().UsingConcreteType<SomethingOne>().WithName("One"); - registry.AddInstanceOf<ISomething>().UsingConcreteType<SomethingTwo>().WithName("Two"); + r.ForRequestedType<ISomething>().AddInstances(x => + { + x.OfConcreteType<SomethingOne>().WithName("One"); + x.OfConcreteType<SomethingTwo>().WithName("Two"); + }); }); Assert.IsInstanceOfType(typeof (SomethingOne), ObjectFactory.GetNamedInstance<ISomething>("One")); @@ -92,13 +175,16 @@ [Test] public void AddNamedInstanceToobjectFactory() { - SomethingOne one = new SomethingOne(); - SomethingOne two = new SomethingOne(); + var one = new SomethingOne(); + var two = new SomethingOne(); - ObjectFactory.Configure(registry => + ObjectFactory.Configure(r => { - registry.AddInstanceOf<ISomething>(one).WithName("One"); - registry.AddInstanceOf<ISomething>(two).WithName("Two"); + r.ForRequestedType<ISomething>().AddInstances(x => + { + x.Object(one).WithName("One"); + x.Object(two).WithName("Two"); + }); }); Assert.AreSame(one, ObjectFactory.GetNamedInstance<ISomething>("One")); @@ -109,10 +195,10 @@ [Test] public void AddPluginForTypeWhenThePluginDoesNotAlreadyExistsDoesNothing() { - PluginGraph pluginGraph = new PluginGraph(); + var pluginGraph = new PluginGraph(); IContainer container = new Container(pluginGraph); container.Configure( - registry => { registry.AddInstanceOf<ISomething>().UsingConcreteType<SomethingOne>(); }); + r => { r.In... [truncated message content] |
From: <jer...@us...> - 2008-09-17 06:48:05
|
Revision: 152 http://structuremap.svn.sourceforge.net/structuremap/?rev=152&view=rev Author: jeremydmiller Date: 2008-09-17 13:48:01 +0000 (Wed, 17 Sep 2008) Log Message: ----------- cleaning up warnings Modified Paths: -------------- trunk/Source/StructureMap/Graph/PluginFamily.cs trunk/Source/StructureMap/StructureMapConfiguration.cs trunk/Source/StructureMap.Testing/Configuration/DSL/ProfileExpressionTester.cs trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs Modified: trunk/Source/StructureMap/Graph/PluginFamily.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginFamily.cs 2008-09-16 18:51:53 UTC (rev 151) +++ trunk/Source/StructureMap/Graph/PluginFamily.cs 2008-09-17 13:48:01 UTC (rev 152) @@ -279,7 +279,6 @@ #endregion - [Obsolete("is this really important?")] public Plugin FindPlugin(Type pluggedType) { return _pluggedTypes.Find(p => p.PluggedType == pluggedType); Modified: trunk/Source/StructureMap/StructureMapConfiguration.cs =================================================================== --- trunk/Source/StructureMap/StructureMapConfiguration.cs 2008-09-16 18:51:53 UTC (rev 151) +++ trunk/Source/StructureMap/StructureMapConfiguration.cs 2008-09-17 13:48:01 UTC (rev 152) @@ -12,7 +12,7 @@ namespace StructureMap { - [Obsolete("Please put configuration into Registry classes and use the ObjectFactory.Initialize() method for configuring the container")] + [Obsolete("Please use the ObjectFactory.Initialize() method for configuring the container and put configuration into Registry classes")] public static class StructureMapConfiguration { private const string CONFIG_FILE_NAME = "StructureMap.config"; @@ -144,6 +144,8 @@ /// <returns></returns> internal static PluginGraph GetPluginGraph() { + _sealed = true; + ConfigurationParser[] parsers = _parserBuilder.GetParsers(); PluginGraphBuilder pluginGraphBuilder = new PluginGraphBuilder(parsers, _registries.ToArray(), _log); Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/ProfileExpressionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/ProfileExpressionTester.cs 2008-09-16 18:51:53 UTC (rev 151) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/ProfileExpressionTester.cs 2008-09-17 13:48:01 UTC (rev 152) @@ -94,8 +94,7 @@ .For<IWidget>().UseNamedInstance(theDefaultName) .For<Rule>().UseNamedInstance("DefaultRule"); - LiteralInstance masterInstance = new LiteralInstance(new AWidget()).WithName(theDefaultName); - registry.AddInstanceOf<IWidget>(masterInstance); + var masterInstance = registry.InstanceOf<IWidget>().Is.Object(new AWidget()).WithName(theDefaultName); ProfileManager manager = registry.Build().ProfileManager; Assert.AreSame(masterInstance, manager.GetDefault(typeof (IWidget), theProfileName)); Modified: trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs 2008-09-16 18:51:53 UTC (rev 151) +++ trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs 2008-09-17 13:48:01 UTC (rev 152) @@ -46,7 +46,7 @@ r.ForRequestedType<OptionalSetterTarget>().TheDefaultIs( (Instance<OptionalSetterTarget>()).WithProperty("Name").EqualTo("Jeremy")); - r.AddInstanceOf<OptionalSetterTarget>(Instance<OptionalSetterTarget>().WithName("NoName")); + r.InstanceOf<OptionalSetterTarget>().Is.OfConcreteType<OptionalSetterTarget>().WithName("NoName"); }); try This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2008-09-17 07:09:23
|
Revision: 153 http://structuremap.svn.sourceforge.net/structuremap/?rev=153&view=rev Author: jeremydmiller Date: 2008-09-17 14:09:19 +0000 (Wed, 17 Sep 2008) Log Message: ----------- added Container.With<T>(T arg).GetAllInstances<T>() Modified Paths: -------------- trunk/Source/StructureMap/Container.cs trunk/Source/StructureMap/ExplicitArgsExpression.cs trunk/Source/StructureMap/IContainer.cs trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs Modified: trunk/Source/StructureMap/Container.cs =================================================================== --- trunk/Source/StructureMap/Container.cs 2008-09-17 13:48:01 UTC (rev 152) +++ trunk/Source/StructureMap/Container.cs 2008-09-17 14:09:19 UTC (rev 153) @@ -104,6 +104,15 @@ return session.CreateInstance(type, instance); } + public IList<T> GetAllInstances<T>(ExplicitArguments args) + { + BuildSession session = withNewSession(); + + args.RegisterDefaults(session); + + return getListOfTypeWithSession<T>(session); + } + public void Inject<PLUGINTYPE>(PLUGINTYPE instance) { _pipelineGraph.Inject(instance); @@ -128,10 +137,13 @@ public IList<T> GetAllInstances<T>() { - List<T> list = new List<T>(); - BuildSession session = withNewSession(); + return getListOfTypeWithSession<T>(session); + } + private IList<T> getListOfTypeWithSession<T>(BuildSession session) + { + List<T> list = new List<T>(); foreach (T instance in forType(typeof (T)).GetAllInstances(session)) { list.Add(instance); @@ -157,6 +169,8 @@ } + + /// <summary> /// Creates a new object instance of the requested type /// </summary> Modified: trunk/Source/StructureMap/ExplicitArgsExpression.cs =================================================================== --- trunk/Source/StructureMap/ExplicitArgsExpression.cs 2008-09-17 13:48:01 UTC (rev 152) +++ trunk/Source/StructureMap/ExplicitArgsExpression.cs 2008-09-17 14:09:19 UTC (rev 153) @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using StructureMap.Pipeline; namespace StructureMap @@ -14,9 +15,9 @@ private readonly IContainer _container; private string _lastArgName; - internal ExplicitArgsExpression(IContainer manager) + internal ExplicitArgsExpression(IContainer container) { - _container = manager; + _container = container; } #region IExplicitProperty Members @@ -71,5 +72,10 @@ { return _container.GetInstance(type, _args); } + + public IList<T> GetAllInstances<T>() + { + return _container.GetAllInstances<T>(_args); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/IContainer.cs =================================================================== --- trunk/Source/StructureMap/IContainer.cs 2008-09-17 13:48:01 UTC (rev 152) +++ trunk/Source/StructureMap/IContainer.cs 2008-09-17 14:09:19 UTC (rev 153) @@ -62,7 +62,8 @@ /// <returns></returns> object GetInstance(Type pluginType, string instanceKey); - PLUGINTYPE GetInstance<PLUGINTYPE>(ExplicitArguments args); + IList<T> GetAllInstances<T>(ExplicitArguments args); + T GetInstance<T>(ExplicitArguments args); ExplicitArgsExpression With<T>(T arg); IExplicitProperty With(string argName); Modified: trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs 2008-09-17 13:48:01 UTC (rev 152) +++ trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs 2008-09-17 14:09:19 UTC (rev 153) @@ -284,6 +284,22 @@ args.SetArg("age", 34); Assert.AreEqual(34, args.GetArg("age")); } + + [Test] + public void pass_explicit_service_into_all_instances() + { + var container = new Container(r => + { + r.ForRequestedType<TradeView>().TheDefaultIsConcreteType<TradeView>().AddConcreteType<SecuredTradeView>(); + }); + + Trade theTrade = new Trade(); + + var views = container.With<Trade>(theTrade).GetAllInstances<TradeView>(); + + views[0].Trade.ShouldBeTheSameAs(theTrade); + views[1].Trade.ShouldBeTheSameAs(theTrade); + } } public class Lump @@ -326,6 +342,13 @@ } } + public class SecuredTradeView : TradeView + { + public SecuredTradeView(Trade trade) : base(trade) + { + } + } + public class Node { } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2008-09-24 22:34:16
|
Revision: 154 http://structuremap.svn.sourceforge.net/structuremap/?rev=154&view=rev Author: jeremydmiller Date: 2008-09-24 21:47:17 +0000 (Wed, 24 Sep 2008) Log Message: ----------- mostly fixes for RhinoAutoMocker Modified Paths: -------------- trunk/Source/StructureMap/BuildSession.cs trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs trunk/Source/StructureMap/Container.cs trunk/Source/StructureMap/IContainer.cs trunk/Source/StructureMap/IInstanceFactory.cs trunk/Source/StructureMap/InstanceFactory.cs trunk/Source/StructureMap/ObjectFactory.cs trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs trunk/Source/StructureMap/PipelineGraph.cs trunk/Source/StructureMap.AutoMocking/AutoMockedContainer.cs trunk/Source/StructureMap.AutoMocking/RhinoAutoMocker.cs trunk/Source/StructureMap.Testing/AutoMocking/RhinoAutoMockerTester.cs trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs Modified: trunk/Source/StructureMap/BuildSession.cs =================================================================== --- trunk/Source/StructureMap/BuildSession.cs 2008-09-17 14:09:19 UTC (rev 153) +++ trunk/Source/StructureMap/BuildSession.cs 2008-09-24 21:47:17 UTC (rev 154) @@ -8,8 +8,17 @@ namespace StructureMap { - public class BuildSession + public interface IContext { + T GetInstance<T>(); + + + BuildStack BuildStack { get; } + Type ParentType { get; } + } + + public class BuildSession : IContext + { private readonly InterceptorLibrary _interceptorLibrary; private readonly PipelineGraph _pipelineGraph; private readonly InstanceCache _cache = new InstanceCache(); @@ -134,5 +143,10 @@ { return _pipelineGraph.ForType(pluginType); } + + T IContext.GetInstance<T>() + { + return (T) CreateInstance(typeof (T)); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs 2008-09-17 14:09:19 UTC (rev 153) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs 2008-09-24 21:47:17 UTC (rev 154) @@ -33,6 +33,11 @@ return returnInstance(new SmartInstance<PLUGGEDTYPE>()); } + public ConfiguredInstance OfConcreteType(Type type) + { + return returnInstance(new ConfiguredInstance(type)); + } + public LiteralInstance Object(T theObject) { return returnInstance(new LiteralInstance(theObject)); @@ -58,7 +63,7 @@ return returnInstance(new ConstructorInstance<T>(func)); } - public ConstructorInstance<T> ConstructedBy(Func<BuildSession, T> func) + public ConstructorInstance<T> ConstructedBy(Func<IContext, T> func) { return returnInstance(new ConstructorInstance<T>(func)); } Modified: trunk/Source/StructureMap/Container.cs =================================================================== --- trunk/Source/StructureMap/Container.cs 2008-09-17 14:09:19 UTC (rev 153) +++ trunk/Source/StructureMap/Container.cs 2008-09-24 21:47:17 UTC (rev 154) @@ -277,11 +277,11 @@ return forType(type).GetAllInstances(withNewSession()); } - public void Configure(Action<Registry> configure) + public void Configure(Action<ConfigurationExpression> configure) { lock (this) { - Registry registry = new Registry(); + ConfigurationExpression registry = new ConfigurationExpression(); configure(registry); PluginGraph graph = registry.Build(); @@ -335,5 +335,9 @@ return _pipelineGraph.ForType(type); } + public void EjectAllInstancesOf<T>() + { + _pipelineGraph.EjectAllInstancesOf<T>(); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/IContainer.cs =================================================================== --- trunk/Source/StructureMap/IContainer.cs 2008-09-17 14:09:19 UTC (rev 153) +++ trunk/Source/StructureMap/IContainer.cs 2008-09-24 21:47:17 UTC (rev 154) @@ -21,7 +21,7 @@ IList GetAllInstances(Type type); - void Configure(Action<Registry> configure); + void Configure(Action<ConfigurationExpression> configure); void Inject<PLUGINTYPE>(PLUGINTYPE instance); void Inject(Type pluginType, object stub); void Inject<T>(string name, T instance); Modified: trunk/Source/StructureMap/IInstanceFactory.cs =================================================================== --- trunk/Source/StructureMap/IInstanceFactory.cs 2008-09-17 14:09:19 UTC (rev 153) +++ trunk/Source/StructureMap/IInstanceFactory.cs 2008-09-24 21:47:17 UTC (rev 154) @@ -22,5 +22,6 @@ void ForEachInstance(Action<Instance> action); void ImportFrom(PluginFamily family); void AcceptVisitor(IPipelineGraphVisitor visitor, Instance defaultInstance); + void EjectAllInstances(); } } \ No newline at end of file Modified: trunk/Source/StructureMap/InstanceFactory.cs =================================================================== --- trunk/Source/StructureMap/InstanceFactory.cs 2008-09-17 14:09:19 UTC (rev 153) +++ trunk/Source/StructureMap/InstanceFactory.cs 2008-09-24 21:47:17 UTC (rev 154) @@ -135,5 +135,10 @@ visitor.PluginType(PluginType, defaultInstance, _policy); ForEachInstance(i => visitor.Instance(PluginType, i)); } + + public void EjectAllInstances() + { + _instances.Clear(); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/ObjectFactory.cs =================================================================== --- trunk/Source/StructureMap/ObjectFactory.cs 2008-09-17 14:09:19 UTC (rev 153) +++ trunk/Source/StructureMap/ObjectFactory.cs 2008-09-24 21:47:17 UTC (rev 154) @@ -176,7 +176,7 @@ _container = container; } - public static void Configure(Action<Registry> configure) + public static void Configure(Action<ConfigurationExpression> configure) { container.Configure(configure); } Modified: trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs 2008-09-17 14:09:19 UTC (rev 153) +++ trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs 2008-09-24 21:47:17 UTC (rev 154) @@ -6,9 +6,9 @@ public class ConstructorInstance<T> : ExpressedInstance<ConstructorInstance<T>> { - private readonly Func<BuildSession, T> _builder; + private readonly Func<IContext, T> _builder; - public ConstructorInstance(Func<BuildSession, T> builder) + public ConstructorInstance(Func<IContext, T> builder) { _builder = builder; } Modified: trunk/Source/StructureMap/PipelineGraph.cs =================================================================== --- trunk/Source/StructureMap/PipelineGraph.cs 2008-09-17 14:09:19 UTC (rev 153) +++ trunk/Source/StructureMap/PipelineGraph.cs 2008-09-24 21:47:17 UTC (rev 154) @@ -191,5 +191,10 @@ ForType(typeof (PLUGINTYPE)).AddInstance(literalInstance); SetDefault(typeof (PLUGINTYPE), literalInstance); } + + public void EjectAllInstancesOf<T>() + { + ForType(typeof (T)).EjectAllInstances(); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap.AutoMocking/AutoMockedContainer.cs =================================================================== --- trunk/Source/StructureMap.AutoMocking/AutoMockedContainer.cs 2008-09-17 14:09:19 UTC (rev 153) +++ trunk/Source/StructureMap.AutoMocking/AutoMockedContainer.cs 2008-09-24 21:47:17 UTC (rev 154) @@ -8,6 +8,10 @@ { private readonly ServiceLocator _locator; + public AutoMockedContainer() : this(new RhinoMocksServiceLocator()) + { + } + public AutoMockedContainer(ServiceLocator locator) { _locator = locator; @@ -19,13 +23,21 @@ return null; } - object service = _locator.Service(pluginType); InstanceFactory factory = new InstanceFactory(new PluginFamily(pluginType)); - LiteralInstance instance = new LiteralInstance(service); + try + { + object service = _locator.Service(pluginType); - profileManager.SetDefault(pluginType, instance); + LiteralInstance instance = new LiteralInstance(service); + profileManager.SetDefault(pluginType, instance); + } + catch (Exception) + { + // ignore errors + } + return factory; }; } Modified: trunk/Source/StructureMap.AutoMocking/RhinoAutoMocker.cs =================================================================== --- trunk/Source/StructureMap.AutoMocking/RhinoAutoMocker.cs 2008-09-17 14:09:19 UTC (rev 153) +++ trunk/Source/StructureMap.AutoMocking/RhinoAutoMocker.cs 2008-09-24 21:47:17 UTC (rev 154) @@ -60,8 +60,23 @@ foreach (ParameterInfo parameterInfo in ctor.GetParameters()) { Type dependencyType = parameterInfo.ParameterType; - object dependency = _container.GetInstance(dependencyType); - list.Add(dependency); + + if (dependencyType.IsArray) + { + var values = _container.GetAllInstances(dependencyType.GetElementType()); + var array = Array.CreateInstance(dependencyType.GetElementType(), values.Count); + values.CopyTo(array, 0); + + list.Add(array); + + } + else + { + object dependency = _container.GetInstance(dependencyType); + list.Add(dependency); + } + + } return list.ToArray(); @@ -85,6 +100,19 @@ _container.Inject(pluginType, stub); } + public void Inject<T>(T target) + { + _container.Inject<T>(target); + } + + public T AddAdditionalMockFor<T>() + { + T mock = DynamicMock<T>(); + _container.Configure(r => r.InstanceOf<T>().Is.Object(mock)); + + return mock; + } + // So that Aaron Jensen can use his concrete HubService object // Construct whatever T is with all mocks, and make sure that the // ClassUnderTest gets built with a concrete T @@ -93,5 +121,36 @@ T concreteClass = _container.FillDependencies<T>(); _container.Inject(concreteClass); } + + public AutoMockedContainer Container + { + get { return _container; } + } + + public T[] CreateMockArrayFor<T>(int count) + { + T[] returnValue = new T[count]; + + for (int i = 0; i < returnValue.Length; i++) + { + returnValue[i] = DynamicMock<T>(); + } + + InjectArray<T>(returnValue); + + return returnValue; + } + + public void InjectArray<T>(T[] stubs) + { + _container.EjectAllInstancesOf<T>(); + _container.Configure(x => + { + foreach (var t in stubs) + { + x.InstanceOf<T>().Is.Object(t); + } + }); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/AutoMocking/RhinoAutoMockerTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/AutoMocking/RhinoAutoMockerTester.cs 2008-09-17 14:09:19 UTC (rev 153) +++ trunk/Source/StructureMap.Testing/AutoMocking/RhinoAutoMockerTester.cs 2008-09-24 21:47:17 UTC (rev 154) @@ -3,6 +3,8 @@ using Rhino.Mocks; using Rhino.Mocks.Interfaces; using StructureMap.AutoMocking; +using StructureMap.Graph; +using StructureMap.Testing.Widget3; namespace StructureMap.Testing.AutoMocking { @@ -14,6 +16,8 @@ [SetUp] public void SetUp() { + PluginCache.ResetAll(); + _mocks = new MockRepository(); _locator = new RhinoMocksServiceLocator(_mocks); _container = new AutoMockedContainer(_locator); @@ -129,7 +133,70 @@ #endregion } + public class ClassWithArray + { + private IMockedService[] _services; + + public ClassWithArray(IMockedService[] services) + { + _services = services; + } + + public IMockedService[] Services + { + get { return _services; } + } + } + [Test] + public void CanInjectAnArrayOfMockServices1() + { + var mocker = new RhinoAutoMocker<ClassWithArray>(); + + IMockedService[] services = mocker.CreateMockArrayFor<IMockedService>(3); + ClassWithArray theClass = mocker.ClassUnderTest; + + theClass.Services.Length.ShouldEqual(3); + } + + [Test] + public void CanInjectAnArrayOfMockServices2() + { + var mocker = new RhinoAutoMocker<ClassWithArray>(); + + ClassWithArray theClass = mocker.ClassUnderTest; + + theClass.Services.Length.ShouldEqual(0); + } + + + [Test] + public void CanInjectAnArrayOfMockServices3() + { + var mocker = new RhinoAutoMocker<ClassWithArray>(); + + IMockedService[] services = mocker.CreateMockArrayFor<IMockedService>(3); + + mocker.PartialMockTheClassUnderTest(); + ClassWithArray theClass = mocker.ClassUnderTest; + + theClass.Services.Length.ShouldEqual(3); + } + + [Test] + public void CanInjectAnArrayOfMockServices4() + { + var mocker = new RhinoAutoMocker<ClassWithArray>(); + + mocker.PartialMockTheClassUnderTest(); + ClassWithArray theClass = mocker.ClassUnderTest; + + theClass.Services.Length.ShouldEqual(0); + } + + + + [Test] public void AutoFillAConcreteClassWithMocks() { IMockedService service = _container.GetInstance<IMockedService>(); Modified: trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs 2008-09-17 14:09:19 UTC (rev 153) +++ trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs 2008-09-24 21:47:17 UTC (rev 154) @@ -223,7 +223,7 @@ container.GetInstance<ClassWithDependency>().Rule.ShouldBeOfType(typeof(ColorRule)); } - private static Logger createLogger(BuildSession session) + private static Logger createLogger(IContext session) { return new Logger(session.ParentType); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2008-09-25 17:38:36
|
Revision: 155 http://structuremap.svn.sourceforge.net/structuremap/?rev=155&view=rev Author: jeremydmiller Date: 2008-09-25 17:38:24 +0000 (Thu, 25 Sep 2008) Log Message: ----------- adding some autoscan capabilities for generics Modified Paths: -------------- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs trunk/Source/StructureMap/Configuration/DSL/Expressions/ScanAssembliesExpression.cs trunk/Source/StructureMap/Pipeline/Instance.cs trunk/Source/StructureMap.AutoMocking/RhinoAutoMocker.cs trunk/Source/StructureMap.AutoMocking/StructureMap.AutoMocking.csproj trunk/Source/StructureMap.Testing/AutoMocking/RhinoAutoMockerTester.cs trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs trunk/Source/StructureMap.Testing/Graph/PluginTester.cs Removed Paths: ------------- trunk/Source/StructureMap.AutoMocking/IntegrationSpecification.cs Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2008-09-24 21:47:17 UTC (rev 154) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2008-09-25 17:38:24 UTC (rev 155) @@ -154,7 +154,13 @@ public CreatePluginFamilyExpression<PLUGINTYPE> AddConcreteType<PLUGGEDTYPE>() { - _alterations.Add(family => family.AddInstance(new SmartInstance<PLUGGEDTYPE>())); + _alterations.Add(family => + { + string name = PluginCache.GetPlugin(typeof (PLUGGEDTYPE)).ConcreteKey; + var instance = new SmartInstance<PLUGGEDTYPE>().WithName(name); + family.AddInstance(instance); + }); + return this; } Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/ScanAssembliesExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/ScanAssembliesExpression.cs 2008-09-24 21:47:17 UTC (rev 154) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/ScanAssembliesExpression.cs 2008-09-25 17:38:24 UTC (rev 155) @@ -66,12 +66,24 @@ return this; } + public ScanAssembliesExpression IncludeAssemblyContainingType(Type type) + { + _assemblies.Add(type.Assembly); + + return this; + } + public ScanAssembliesExpression AddAllTypesOf<PLUGINTYPE>() { + return AddAllTypesOf(typeof (PLUGINTYPE)); + } + + public ScanAssembliesExpression AddAllTypesOf(Type pluginType) + { _registry.addExpression(pluginGraph => { PluginFamily family = - pluginGraph.FindFamily(typeof (PLUGINTYPE)); + pluginGraph.FindFamily(pluginType); family.SearchForImplicitPlugins = true; }); Modified: trunk/Source/StructureMap/Pipeline/Instance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/Instance.cs 2008-09-24 21:47:17 UTC (rev 154) +++ trunk/Source/StructureMap/Pipeline/Instance.cs 2008-09-25 17:38:24 UTC (rev 155) @@ -7,6 +7,15 @@ namespace StructureMap.Pipeline { + public static class TypeExtensions + { + public static ReferencedInstance GetReferenceTo(this Type type) + { + string key = PluginCache.GetPlugin(type).ConcreteKey; + return new ReferencedInstance(key); + } + } + public interface IDiagnosticInstance { bool CanBePartOfPluginFamily(PluginFamily family); Deleted: trunk/Source/StructureMap.AutoMocking/IntegrationSpecification.cs =================================================================== --- trunk/Source/StructureMap.AutoMocking/IntegrationSpecification.cs 2008-09-24 21:47:17 UTC (rev 154) +++ trunk/Source/StructureMap.AutoMocking/IntegrationSpecification.cs 2008-09-25 17:38:24 UTC (rev 155) @@ -1,6 +0,0 @@ -namespace StructureMap.AutoMocking -{ - public class IntegrationSpecification<TARGETCLASS> - { - } -} \ No newline at end of file Modified: trunk/Source/StructureMap.AutoMocking/RhinoAutoMocker.cs =================================================================== --- trunk/Source/StructureMap.AutoMocking/RhinoAutoMocker.cs 2008-09-24 21:47:17 UTC (rev 154) +++ trunk/Source/StructureMap.AutoMocking/RhinoAutoMocker.cs 2008-09-25 17:38:24 UTC (rev 155) @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Reflection; using Rhino.Mocks; @@ -10,7 +11,10 @@ public delegate void VoidMethod(); - // Note that it subclasses the RhinoMocks.MockRepository class + /// <summary> + /// Provides an "Auto Mocking Container" for the concrete class TARGETCLASS + /// </summary> + /// <typeparam name="TARGETCLASS">The concrete class being tested</typeparam> public class RhinoAutoMocker<TARGETCLASS> : MockRepository where TARGETCLASS : class { private readonly AutoMockedContainer _container; @@ -18,16 +22,15 @@ public RhinoAutoMocker() { - RhinoMocksServiceLocator locator = new RhinoMocksServiceLocator(this); + var locator = new RhinoMocksServiceLocator(this); _container = new AutoMockedContainer(locator); } - // Replaces the inner Container in ObjectFactory with the mocked - // Container from the auto mocking container. This will make ObjectFactory - // return mocks for everything. Use cautiously!!!!!!!!!!!!!!! - // Gets the ClassUnderTest with mock objects (or stubs) pushed in + /// <summary> + ///Gets an instance of the ClassUnderTest with mock objects (or stubs) pushed in // for all of its dependencies + /// </summary> public TARGETCLASS ClassUnderTest { get @@ -41,13 +44,27 @@ } } + /// <summary> + /// Accesses the underlying AutoMockedContainer + /// </summary> + public AutoMockedContainer Container + { + get { return _container; } + } + + /// <summary> + /// Use this with EXTREME caution. This will replace the active "Container" in accessed + /// by ObjectFactory with the AutoMockedContainer from this instance + /// </summary> public void MockObjectFactory() { ObjectFactory.ReplaceManager(_container); } - // I find it useful from time to time to use partial mocks for the ClassUnderTest - // Especially in Presenter testing + /// <summary> + /// Calling this method will immediately create a "Partial" mock + /// for the ClassUnderTest using the "Greediest" constructor. + /// </summary> public void PartialMockTheClassUnderTest() { _classUnderTest = PartialMock<TARGETCLASS>(getConstructorArgs()); @@ -56,97 +73,123 @@ private object[] getConstructorArgs() { ConstructorInfo ctor = Constructor.GetGreediestConstructor(typeof (TARGETCLASS)); - List<object> list = new List<object>(); + var list = new List<object>(); foreach (ParameterInfo parameterInfo in ctor.GetParameters()) { Type dependencyType = parameterInfo.ParameterType; if (dependencyType.IsArray) { - var values = _container.GetAllInstances(dependencyType.GetElementType()); - var array = Array.CreateInstance(dependencyType.GetElementType(), values.Count); + IList values = _container.GetAllInstances(dependencyType.GetElementType()); + Array array = Array.CreateInstance(dependencyType.GetElementType(), values.Count); values.CopyTo(array, 0); list.Add(array); - } else { object dependency = _container.GetInstance(dependencyType); list.Add(dependency); } - - } return list.ToArray(); } - // Get one of the mock objects that are injected into the constructor function - // of the ClassUnderTest + /// <summary> + /// Gets the mock object for type T that would be injected into the constructor function + /// of the ClassUnderTest + /// </summary> + /// <typeparam name="T"></typeparam> + /// <returns></returns> public T Get<T>() { return _container.GetInstance<T>(); } - // Set the auto mocking container to use a Stub for Type T - public void InjectStub<T>(T stub) - { - _container.Inject<T>(stub); - } - + /// <summary> + /// Method to specify the exact object that will be used for + /// "pluginType." Useful for stub objects and/or static mocks + /// </summary> + /// <param name="pluginType"></param> + /// <param name="stub"></param> public void Inject(Type pluginType, object stub) { _container.Inject(pluginType, stub); } + /// <summary> + /// Method to specify the exact object that will be used for + /// "pluginType." Useful for stub objects and/or static mocks + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="target"></param> public void Inject<T>(T target) { - _container.Inject<T>(target); + _container.Inject(target); } + + /// <summary> + /// Adds an additional mock object for a given T + /// Useful for array arguments to the ClassUnderTest + /// object + /// </summary> + /// <typeparam name="T"></typeparam> + /// <returns></returns> public T AddAdditionalMockFor<T>() { - T mock = DynamicMock<T>(); + var mock = DynamicMock<T>(); _container.Configure(r => r.InstanceOf<T>().Is.Object(mock)); return mock; } - // So that Aaron Jensen can use his concrete HubService object - // Construct whatever T is with all mocks, and make sure that the - // ClassUnderTest gets built with a concrete T + + /// <summary> + /// So that Aaron Jensen can use his concrete HubService object + /// Construct whatever T is with all mocks, and make sure that the + /// ClassUnderTest gets built with a concrete T + /// </summary> + /// <typeparam name="T"></typeparam> public void UseConcreteClassFor<T>() { - T concreteClass = _container.FillDependencies<T>(); + var concreteClass = _container.FillDependencies<T>(); _container.Inject(concreteClass); } - public AutoMockedContainer Container + /// <summary> + /// Creates, returns, and registers an array of mock objects for type T. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="count"></param> + /// <returns></returns> + public T[] CreateMockArrayFor<T>(int count) { - get { return _container; } - } + var returnValue = new T[count]; - public T[] CreateMockArrayFor<T>(int count) - { - T[] returnValue = new T[count]; - for (int i = 0; i < returnValue.Length; i++) { returnValue[i] = DynamicMock<T>(); } - InjectArray<T>(returnValue); + InjectArray(returnValue); return returnValue; } + /// <summary> + /// Allows you to "inject" an array of known objects for an + /// argument of type T[] in the ClassUnderTest + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="stubs"></param> public void InjectArray<T>(T[] stubs) { _container.EjectAllInstancesOf<T>(); _container.Configure(x => { - foreach (var t in stubs) + foreach (T t in stubs) { x.InstanceOf<T>().Is.Object(t); } Modified: trunk/Source/StructureMap.AutoMocking/StructureMap.AutoMocking.csproj =================================================================== --- trunk/Source/StructureMap.AutoMocking/StructureMap.AutoMocking.csproj 2008-09-24 21:47:17 UTC (rev 154) +++ trunk/Source/StructureMap.AutoMocking/StructureMap.AutoMocking.csproj 2008-09-25 17:38:24 UTC (rev 155) @@ -67,7 +67,6 @@ <Link>CommonAssemblyInfo.cs</Link> </Compile> <Compile Include="AutoMockedContainer.cs" /> - <Compile Include="IntegrationSpecification.cs" /> <Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="RhinoAutoMocker.cs" /> <Compile Include="RhinoMocksServiceLocator.cs" /> Modified: trunk/Source/StructureMap.Testing/AutoMocking/RhinoAutoMockerTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/AutoMocking/RhinoAutoMockerTester.cs 2008-09-24 21:47:17 UTC (rev 154) +++ trunk/Source/StructureMap.Testing/AutoMocking/RhinoAutoMockerTester.cs 2008-09-25 17:38:24 UTC (rev 155) @@ -4,7 +4,6 @@ using Rhino.Mocks.Interfaces; using StructureMap.AutoMocking; using StructureMap.Graph; -using StructureMap.Testing.Widget3; namespace StructureMap.Testing.AutoMocking { @@ -135,7 +134,7 @@ public class ClassWithArray { - private IMockedService[] _services; + private readonly IMockedService[] _services; public ClassWithArray(IMockedService[] services) { @@ -149,6 +148,20 @@ } [Test] + public void AutoFillAConcreteClassWithMocks() + { + var service = _container.GetInstance<IMockedService>(); + var service2 = _container.GetInstance<IMockedService2>(); + var service3 = _container.GetInstance<IMockedService3>(); + + var concreteClass = _container.FillDependencies<ConcreteClass>(); + + Assert.AreSame(service, concreteClass.Service); + Assert.AreSame(service2, concreteClass.Service2); + Assert.AreSame(service3, concreteClass.Service3); + } + + [Test] public void CanInjectAnArrayOfMockServices1() { var mocker = new RhinoAutoMocker<ClassWithArray>(); @@ -162,7 +175,7 @@ [Test] public void CanInjectAnArrayOfMockServices2() { - var mocker = new RhinoAutoMocker<ClassWithArray>(); + var mocker = new RhinoAutoMocker<ClassWithArray>(); ClassWithArray theClass = mocker.ClassUnderTest; @@ -194,37 +207,22 @@ theClass.Services.Length.ShouldEqual(0); } - [Test] - public void AutoFillAConcreteClassWithMocks() - { - IMockedService service = _container.GetInstance<IMockedService>(); - IMockedService2 service2 = _container.GetInstance<IMockedService2>(); - IMockedService3 service3 = _container.GetInstance<IMockedService3>(); - - ConcreteClass concreteClass = _container.FillDependencies<ConcreteClass>(); - - Assert.AreSame(service, concreteClass.Service); - Assert.AreSame(service2, concreteClass.Service2); - Assert.AreSame(service3, concreteClass.Service3); - } - - [Test] public void GetAFullMockForAServiceThatHasNotPreviouslyBeenRequested() { - IMockedService service = _container.GetInstance<IMockedService>(); + var service = _container.GetInstance<IMockedService>(); Assert.IsNotNull(service); - IMockedObject instance = (IMockedObject) service; + var instance = (IMockedObject) service; Assert.AreSame(_mocks, instance.Repository); } [Test] public void GetTheSameConcreteClassTwiceFromCreate() { - RhinoAutoMocker<ConcreteClass> autoMocker = new RhinoAutoMocker<ConcreteClass>(); + var autoMocker = new RhinoAutoMocker<ConcreteClass>(); ConcreteClass concreteClass = autoMocker.ClassUnderTest; Assert.AreSame(concreteClass, autoMocker.ClassUnderTest); @@ -235,7 +233,7 @@ [Test] public void InjectAStubAndGetTheStubBack() { - StubService stub = new StubService(); + var stub = new StubService(); _container.Inject<IMockedService>(stub); Assert.AreSame(stub, _container.GetInstance<IMockedService>()); @@ -246,7 +244,7 @@ [Test] public void RequestTheServiceTwiceAndGetTheExactSameMockObject() { - IMockedService service = _container.GetInstance<IMockedService>(); + var service = _container.GetInstance<IMockedService>(); Assert.AreSame(service, _container.GetInstance<IMockedService>()); Assert.AreSame(service, _container.GetInstance<IMockedService>()); Assert.AreSame(service, _container.GetInstance<IMockedService>()); @@ -256,12 +254,12 @@ [Test] public void TheAutoMockerPushesInMocksAndAPreBuiltStubForAllOfTheConstructorArguments() { - RhinoAutoMocker<ConcreteClass> autoMocker = new RhinoAutoMocker<ConcreteClass>(); - StubService stub = new StubService(); - autoMocker.InjectStub<IMockedService>(stub); + var autoMocker = new RhinoAutoMocker<ConcreteClass>(); + var stub = new StubService(); + autoMocker.Inject<IMockedService>(stub); - IMockedService2 service2 = autoMocker.Get<IMockedService2>(); - IMockedService3 service3 = autoMocker.Get<IMockedService3>(); + var service2 = autoMocker.Get<IMockedService2>(); + var service3 = autoMocker.Get<IMockedService3>(); ConcreteClass concreteClass = autoMocker.ClassUnderTest; @@ -273,11 +271,11 @@ [Test] public void TheAutoMockerPushesInMocksForAllOfTheConstructorArgumentsForAPartialMock() { - RhinoAutoMocker<ConcreteClass> autoMocker = new RhinoAutoMocker<ConcreteClass>(); + var autoMocker = new RhinoAutoMocker<ConcreteClass>(); - IMockedService service = autoMocker.Get<IMockedService>(); - IMockedService2 service2 = autoMocker.Get<IMockedService2>(); - IMockedService3 service3 = autoMocker.Get<IMockedService3>(); + var service = autoMocker.Get<IMockedService>(); + var service2 = autoMocker.Get<IMockedService2>(); + var service3 = autoMocker.Get<IMockedService3>(); autoMocker.PartialMockTheClassUnderTest(); ConcreteClass concreteClass = autoMocker.ClassUnderTest; @@ -290,10 +288,10 @@ [Test] public void UseConcreteClassFor() { - RhinoAutoMocker<ConcreteClass> mocker = new RhinoAutoMocker<ConcreteClass>(); + var mocker = new RhinoAutoMocker<ConcreteClass>(); mocker.UseConcreteClassFor<ConcreteThing>(); - ConcreteThing thing = mocker.Get<ConcreteThing>(); + var thing = mocker.Get<ConcreteThing>(); Assert.IsInstanceOfType(typeof (ConcreteThing), thing); Assert.AreSame(mocker.Get<IMockedService>(), thing.Service); @@ -303,7 +301,7 @@ [Test] public void UseTheAutoMockerToStartUpTheConcreteClass() { - RhinoAutoMocker<ConcreteClass> autoMocker = new RhinoAutoMocker<ConcreteClass>(); + var autoMocker = new RhinoAutoMocker<ConcreteClass>(); using (autoMocker.Record()) { @@ -316,7 +314,7 @@ [Test] public void UseTheAutoMockerToStartUpTheConcreteClassAsAPartialMockAndSetTheNameMethodUp() { - RhinoAutoMocker<ConcreteClass> autoMocker = new RhinoAutoMocker<ConcreteClass>(); + var autoMocker = new RhinoAutoMocker<ConcreteClass>(); autoMocker.PartialMockTheClassUnderTest(); ConcreteClass concreteClass = autoMocker.ClassUnderTest; Modified: trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs 2008-09-24 21:47:17 UTC (rev 154) +++ trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs 2008-09-25 17:38:24 UTC (rev 155) @@ -97,7 +97,37 @@ Assert.IsTrue(found); } + [Test] + public void Add_an_assembly_on_the_fly_and_pick_up_plugins2() + { + var container = new Container(); + container.Configure( + registry => { registry.ScanAssemblies().IncludeAssemblyContainingType(typeof(IService<>)).AddAllTypesOf(typeof(IService<>)); }); + + IList<IService<string>> instances = container.GetAllInstances<IService<string>>(); + instances.Count.ShouldBeGreaterThan(0); + } + + + [Test] + public void Add_an_assembly_on_the_fly_and_pick_up_plugins3() + { + var container = new Container(); + container.Configure( + registry => { registry.ScanAssemblies().IncludeTheCallingAssembly().AddAllTypesOf(typeof(IWidget)); }); + + IList<IWidget> instances = container.GetAllInstances<IWidget>(); + bool found = false; + foreach (IWidget widget in instances) + { + found |= widget.GetType().Equals(typeof(TheWidget)); + } + + Assert.IsTrue(found); + } + + [Test] public void Add_generic_stuff_in_configure() { var container = new Container(); Modified: trunk/Source/StructureMap.Testing/Graph/PluginTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/PluginTester.cs 2008-09-24 21:47:17 UTC (rev 154) +++ trunk/Source/StructureMap.Testing/Graph/PluginTester.cs 2008-09-25 17:38:24 UTC (rev 155) @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Reflection; using NUnit.Framework; using Rhino.Mocks; @@ -86,7 +87,18 @@ } } + [Test] + public void Can_get_the_referencedInstance_for_a_type() + { + Container container = new Container(r => r.ForRequestedType<IEngine>().AddConcreteType<DOHCEngine>()); + Debug.WriteLine(container.WhatDoIHave()); + + Instance instance = typeof (DOHCEngine).GetReferenceTo(); + + container.GetInstance<IEngine>(instance).ShouldBeOfType(typeof(DOHCEngine)); + } + [Test] public void BadPluginToAbstractClass() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2008-10-01 15:54:16
|
Revision: 159 http://structuremap.svn.sourceforge.net/structuremap/?rev=159&view=rev Author: jeremydmiller Date: 2008-10-01 15:53:44 +0000 (Wed, 01 Oct 2008) Log Message: ----------- AssemblyScanner refactoring Modified Paths: -------------- trunk/Source/StructureMap/BuildSession.cs trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs trunk/Source/StructureMap/Configuration/DSL/Expressions/ScanAssembliesExpression.cs trunk/Source/StructureMap/Configuration/GraphBuilder.cs trunk/Source/StructureMap/Diagnostics/BuildError.cs trunk/Source/StructureMap/Diagnostics/ValidationBuildSession.cs trunk/Source/StructureMap/Diagnostics/ValidationError.cs trunk/Source/StructureMap/Graph/AssemblyScanner.cs trunk/Source/StructureMap/Graph/ITypeScanner.cs trunk/Source/StructureMap/Graph/PluginFamily.cs trunk/Source/StructureMap/Graph/PluginFamilyCollection.cs trunk/Source/StructureMap/Graph/PluginGraph.cs trunk/Source/StructureMap/Graph/TypeRules.cs trunk/Source/StructureMap/InstanceFactory.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs trunk/Source/StructureMap/Pipeline/ProfileManager.cs trunk/Source/StructureMap/Pipeline/SmartInstance.cs trunk/Source/StructureMap/StructureMap.csproj trunk/Source/StructureMap/StructureMapConfiguration.cs trunk/Source/StructureMap.Testing/GenericsAcceptanceTester.cs trunk/Source/StructureMap.Testing/Graph/ArrayConstructorTester.cs trunk/Source/StructureMap.Testing/Graph/DefaultConventionScanningTester.cs trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs trunk/Source/StructureMap.Testing/Graph/PluginGraphTester.cs trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs trunk/Source/StructureMap.Testing/SpecificationExtensions.cs Added Paths: ----------- trunk/Source/StructureMap/Graph/FamilyAttributeScanner.cs trunk/Source/StructureMap/Graph/FindAllTypesFilter.cs trunk/Source/StructureMap/Graph/FindRegistriesScanner.cs trunk/Source/StructureMap/Graph/PluggableAttributeScanner.cs Modified: trunk/Source/StructureMap/BuildSession.cs =================================================================== --- trunk/Source/StructureMap/BuildSession.cs 2008-09-30 18:00:10 UTC (rev 158) +++ trunk/Source/StructureMap/BuildSession.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -120,6 +120,7 @@ public virtual object ApplyInterception(Type pluginType, object actualValue) { + if (actualValue == null) return null; return _interceptorLibrary.FindInterceptor(actualValue.GetType()).Process(actualValue); } Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs 2008-09-30 18:00:10 UTC (rev 158) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -6,6 +6,8 @@ public interface IsExpression<T> { InstanceExpression<T> Is { get; } + void IsThis(Instance instance); + LiteralInstance IsThis(T obj); } public class InstanceExpression<T> : IsExpression<T> @@ -17,14 +19,14 @@ _action = action; } - public void Is(Instance instance) + public void Instance(Instance instance) { _action(instance); } private T returnInstance<T>(T instance) where T : Instance { - Is(instance); + Instance(instance); return instance; } @@ -48,6 +50,16 @@ get { return this; } } + public void IsThis(Instance instance) + { + returnInstance(instance); + } + + public LiteralInstance IsThis(T obj) + { + return returnInstance(new LiteralInstance(obj)); + } + public ReferencedInstance References(string key) { return returnInstance(new ReferencedInstance(key)); Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/ScanAssembliesExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/ScanAssembliesExpression.cs 2008-09-30 18:00:10 UTC (rev 158) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/ScanAssembliesExpression.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -82,9 +82,7 @@ { _registry.addExpression(pluginGraph => { - PluginFamily family = - pluginGraph.FindFamily(pluginType); - family.SearchForImplicitPlugins = true; + pluginGraph.Assemblies.AddScanner(new FindAllTypesFilter(pluginType)); }); return this; @@ -108,7 +106,18 @@ public ScanAssembliesExpression With<T>() where T : ITypeScanner, new() { - return With(new T()); + _registry.addExpression(graph => graph.Assemblies.AddScanner<T>()); + return this; } + + // TODO: Need a test here + public ScanAssembliesExpression With<T>(Action<T> configure) where T : ITypeScanner, new() + { + T scanner = new T(); + configure(scanner); + + _registry.addExpression(graph => graph.Assemblies.AddScanner(scanner)); + return this; + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Configuration/GraphBuilder.cs =================================================================== --- trunk/Source/StructureMap/Configuration/GraphBuilder.cs 2008-09-30 18:00:10 UTC (rev 158) +++ trunk/Source/StructureMap/Configuration/GraphBuilder.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -1,6 +1,7 @@ using System; using System.Reflection; using StructureMap.Configuration.DSL; +using StructureMap.Diagnostics; using StructureMap.Graph; using StructureMap.Pipeline; @@ -26,8 +27,11 @@ registry.ConfigurePluginGraph(_pluginGraph); } - _systemGraph = new PluginGraph(false); - _systemGraph.Assemblies.Add(Assembly.GetExecutingAssembly()); + AssemblyScanner scanner = new AssemblyScanner(new GraphLog()); + scanner.Add(Assembly.GetExecutingAssembly()); + scanner.IgnoreRegistries(); + + _systemGraph = new PluginGraph(scanner); } #region IGraphBuilder Members Modified: trunk/Source/StructureMap/Diagnostics/BuildError.cs =================================================================== --- trunk/Source/StructureMap/Diagnostics/BuildError.cs 2008-09-30 18:00:10 UTC (rev 158) +++ trunk/Source/StructureMap/Diagnostics/BuildError.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -85,7 +85,9 @@ writer.WriteLine(); writer.WriteLine("-----------------------------------------------------------------------------------------------------"); - writer.WriteLine("Build Error on Instance '{0}' ({1}) in PluginType {2}", Instance.Name, description, TypePath.GetAssemblyQualifiedName(PluginType)); + writer.WriteLine("Build Error on Instance '{0}' ({1})\n for PluginType {2}", Instance.Name, description, PluginType.AssemblyQualifiedName); + writer.WriteLine(); + if (Exception != null) writer.WriteLine(Exception.ToString()); writer.WriteLine(); } Modified: trunk/Source/StructureMap/Diagnostics/ValidationBuildSession.cs =================================================================== --- trunk/Source/StructureMap/Diagnostics/ValidationBuildSession.cs 2008-09-30 18:00:10 UTC (rev 158) +++ trunk/Source/StructureMap/Diagnostics/ValidationBuildSession.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -114,6 +114,8 @@ private void validate(Type pluginType, Instance instance, object builtObject) { + if (builtObject == null) return; + MethodInfo[] methods = ValidationMethodAttribute.GetValidationMethods(builtObject.GetType()); foreach (MethodInfo method in methods) { Modified: trunk/Source/StructureMap/Diagnostics/ValidationError.cs =================================================================== --- trunk/Source/StructureMap/Diagnostics/ValidationError.cs 2008-09-30 18:00:10 UTC (rev 158) +++ trunk/Source/StructureMap/Diagnostics/ValidationError.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -27,7 +27,8 @@ writer.WriteLine(); writer.WriteLine("-----------------------------------------------------------------------------------------------------"); - writer.WriteLine("Validation Error in Method {0} of Instance {1} in PluginType {2}", MethodName, description, TypePath.GetAssemblyQualifiedName(PluginType)); + writer.WriteLine("Validation Error in Method {0} of Instance '{1}' ({2})\n in PluginType {3}", MethodName, Instance.Name, description, TypePath.GetAssemblyQualifiedName(PluginType)); + writer.WriteLine(); writer.WriteLine(Exception.ToString()); writer.WriteLine(); } Modified: trunk/Source/StructureMap/Graph/AssemblyScanner.cs =================================================================== --- trunk/Source/StructureMap/Graph/AssemblyScanner.cs 2008-09-30 18:00:10 UTC (rev 158) +++ trunk/Source/StructureMap/Graph/AssemblyScanner.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -3,6 +3,7 @@ using System.Reflection; using StructureMap.Configuration.DSL; using StructureMap.Diagnostics; +using System.Linq; namespace StructureMap.Graph { @@ -15,6 +16,9 @@ public AssemblyScanner(GraphLog log) { _log = log; + AddScanner<FamilyAttributeScanner>(); + AddScanner<PluggableAttributeScanner>(); + AddScanner<FindRegistriesScanner>(); } public int Count @@ -41,42 +45,18 @@ registry.ConfigurePluginGraph(pluginGraph); }); - - findFamiliesAndPlugins(pluginGraph); runScanners(pluginGraph); } private void runScanners(PluginGraph graph) { - Registry registry = new Registry(); - scanTypes(type => _scanners.ForEach(scanner => scanner.Process(type, registry))); - - registry.ConfigurePluginGraph(graph); + scanTypes(type => _scanners.ForEach(scanner => scanner.Process(type, graph))); } - private void findFamiliesAndPlugins(PluginGraph pluginGraph) - { - scanTypes(type => - { - if (PluginFamilyAttribute.MarkedAsPluginFamily(type)) - { - pluginGraph.CreateFamily(type); - } - }); - - scanTypes(type => - { - foreach (PluginFamily family in pluginGraph.PluginFamilies) - { - family.AnalyzeTypeForPlugin(type); - } - }); - } - - public void ScanForStructureMapObjects(PluginGraph pluginGraph) { - findFamiliesAndPlugins(pluginGraph); + // I think this just needs to look for attributes only + throw new NotImplementedException(); } private void scanTypes(Action<Type> action) @@ -139,7 +119,23 @@ public void AddScanner(ITypeScanner scanner) { + if (_scanners.Contains(scanner)) return; + _scanners.Add(scanner); } + + public void AddScanner<T>() where T : ITypeScanner, new() + { + var previous = _scanners.FirstOrDefault(scanner => scanner is T); + if (previous == null) + { + AddScanner(new T()); + } + } + + public void IgnoreRegistries() + { + _scanners.RemoveAll(x => x is FindRegistriesScanner); + } } } \ No newline at end of file Added: trunk/Source/StructureMap/Graph/FamilyAttributeScanner.cs =================================================================== --- trunk/Source/StructureMap/Graph/FamilyAttributeScanner.cs (rev 0) +++ trunk/Source/StructureMap/Graph/FamilyAttributeScanner.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -0,0 +1,15 @@ +using System; + +namespace StructureMap.Graph +{ + public class FamilyAttributeScanner : ITypeScanner + { + public void Process(Type type, PluginGraph graph) + { + if (PluginFamilyAttribute.MarkedAsPluginFamily(type)) + { + graph.CreateFamily(type); + } + } + } +} \ No newline at end of file Added: trunk/Source/StructureMap/Graph/FindAllTypesFilter.cs =================================================================== --- trunk/Source/StructureMap/Graph/FindAllTypesFilter.cs (rev 0) +++ trunk/Source/StructureMap/Graph/FindAllTypesFilter.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -0,0 +1,22 @@ +using System; + +namespace StructureMap.Graph +{ + public class FindAllTypesFilter : TypeRules, ITypeScanner + { + private readonly Type _pluginType; + + public FindAllTypesFilter(Type pluginType) + { + _pluginType = pluginType; + } + + public void Process(Type type, PluginGraph graph) + { + if (CanBeCast(_pluginType, type)) + { + graph.AddType(_pluginType, type); + } + } + } +} \ No newline at end of file Added: trunk/Source/StructureMap/Graph/FindRegistriesScanner.cs =================================================================== --- trunk/Source/StructureMap/Graph/FindRegistriesScanner.cs (rev 0) +++ trunk/Source/StructureMap/Graph/FindRegistriesScanner.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -0,0 +1,24 @@ +using System; +using StructureMap.Configuration.DSL; + +namespace StructureMap.Graph +{ + public class FindRegistriesScanner : ITypeScanner + { + public void Process(Type type, PluginGraph graph) + { + if (!Registry.IsPublicRegistry(type)) return; + + foreach (var previous in graph.Registries) + { + if (previous.GetType().Equals(type)) + { + return; + } + } + + Registry registry = (Registry)Activator.CreateInstance(type); + registry.ConfigurePluginGraph(graph); + } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap/Graph/ITypeScanner.cs =================================================================== --- trunk/Source/StructureMap/Graph/ITypeScanner.cs 2008-09-30 18:00:10 UTC (rev 158) +++ trunk/Source/StructureMap/Graph/ITypeScanner.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -1,31 +1,30 @@ using System; using System.Collections.Generic; -using System.Text; -using StructureMap.Configuration.DSL; -using StructureMap.Pipeline; namespace StructureMap.Graph { public interface ITypeScanner { - void Process(Type type, Registry registry); + void Process(Type type, PluginGraph graph); } public class DefaultConventionScanner : TypeRules, ITypeScanner { - public void Process(Type type, Registry registry) + #region ITypeScanner Members + + public void Process(Type type, PluginGraph graph) { if (!IsConcrete(type)) return; - - Type pluginType = FindPluginType(type); if (pluginType != null && Constructor.HasConstructors(type)) { - registry.ForRequestedType(pluginType).AddInstance(new ConfiguredInstance(type)); + graph.AddType(pluginType, type); } } + #endregion + public virtual Type FindPluginType(Type concreteType) { string interfaceName = "I" + concreteType.Name; @@ -33,4 +32,4 @@ return Array.Find(interfaces, t => t.Name == interfaceName); } } -} +} \ No newline at end of file Added: trunk/Source/StructureMap/Graph/PluggableAttributeScanner.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluggableAttributeScanner.cs (rev 0) +++ trunk/Source/StructureMap/Graph/PluggableAttributeScanner.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -0,0 +1,15 @@ +using System; + +namespace StructureMap.Graph +{ + public class PluggableAttributeScanner : ITypeScanner + { + public void Process(Type type, PluginGraph graph) + { + if (PluggableAttribute.MarkedAsPluggable(type)) + { + graph.AddType(type); + } + } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap/Graph/PluginFamily.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginFamily.cs 2008-09-30 18:00:10 UTC (rev 158) +++ trunk/Source/StructureMap/Graph/PluginFamily.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -13,16 +13,13 @@ /// </summary> public class PluginFamily : TypeRules, IPluginFamily { - private readonly Predicate<Type> _explicitlyMarkedPluginFilter; - private readonly Predicate<Type> _implicitPluginFilter; private readonly Cache<string, Instance> _instances = new Cache<string, Instance>(delegate { return null; }); private readonly List<InstanceMemento> _mementoList = new List<InstanceMemento>(); - private Cache<string, Plugin> _pluggedTypes = new Cache<string, Plugin>(); + private readonly Cache<string, Plugin> _pluggedTypes = new Cache<string, Plugin>(); private readonly Type _pluginType; private IBuildPolicy _buildPolicy = new BuildPolicy(); private string _defaultKey = string.Empty; private PluginGraph _parent; - private Predicate<Type> _pluginFilter; private IBuildPolicy _policy; public PluginFamily(Type pluginType) @@ -37,10 +34,6 @@ PluginFamilyAttribute.ConfigureFamily(this); - _explicitlyMarkedPluginFilter = (type => IsExplicitlyMarkedAsPlugin(PluginType, type)); - _implicitPluginFilter = (type => CanBeCast(PluginType, type)); - _pluginFilter = _explicitlyMarkedPluginFilter; - if (IsConcrete(pluginType)) { Plugin plugin = PluginCache.GetPlugin(pluginType); @@ -113,6 +106,11 @@ } + public void AddTypes(List<Type> pluggedTypes) + { + pluggedTypes.ForEach(type => AddType(type)); + } + public void Seal() { _mementoList.ForEach(memento => _parent.Log.Try(() => @@ -175,18 +173,6 @@ return _instances.Retrieve(name); } - - public void AnalyzeTypeForPlugin(Type pluggedType) - { - if (_pluginFilter(pluggedType)) - { - if (!HasPlugin(pluggedType)) - { - AddPlugin(pluggedType); - } - } - } - public bool HasPlugin(Type pluggedType) { return _pluggedTypes.Exists(plugin => plugin.PluggedType == pluggedType); @@ -235,15 +221,9 @@ public bool IsGenericTemplate { - get { return _pluginType.IsGenericTypeDefinition; } + get { return _pluginType.IsGenericTypeDefinition || _pluginType.ContainsGenericParameters; } } - public bool SearchForImplicitPlugins - { - get { return ReferenceEquals(_pluginFilter, _implicitPluginFilter); } - set { _pluginFilter = value ? _implicitPluginFilter : _explicitlyMarkedPluginFilter; } - } - public IBuildPolicy Policy { get { return _buildPolicy; } @@ -356,5 +336,15 @@ return templatedFamily; } + + public void AddType(Type concreteType) + { + if (!CanBeCast(_pluginType, concreteType)) return; + + if (FindPlugin(concreteType) == null) + { + AddPlugin(concreteType); + } + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Graph/PluginFamilyCollection.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginFamilyCollection.cs 2008-09-30 18:00:10 UTC (rev 158) +++ trunk/Source/StructureMap/Graph/PluginFamilyCollection.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -92,5 +92,13 @@ { return Contains(typeof (T)); } + + public void Each(Action<PluginFamily> action) + { + foreach (var family in All) + { + action(family); + } + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Graph/PluginGraph.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginGraph.cs 2008-09-30 18:00:10 UTC (rev 158) +++ trunk/Source/StructureMap/Graph/PluginGraph.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -21,10 +21,9 @@ private GraphLog _log = new GraphLog(); private readonly PluginFamilyCollection _pluginFamilies; private readonly ProfileManager _profileManager = new ProfileManager(); - private readonly bool _useExternalRegistries = true; private bool _sealed = false; private readonly List<Registry> _registries = new List<Registry>(); - + private readonly List<Type> _pluggedTypes = new List<Type>(); /// <summary> @@ -36,10 +35,10 @@ _pluginFamilies = new PluginFamilyCollection(this); } - - public PluginGraph(bool useExternalRegistries) : this() + public PluginGraph(AssemblyScanner assemblies) { - _useExternalRegistries = useExternalRegistries; + _assemblies = assemblies; + _pluginFamilies = new PluginFamilyCollection(this); } public List<Registry> Registries @@ -96,24 +95,13 @@ return; } - if (_useExternalRegistries) - { - _assemblies.ScanForAll(this); - } - else - { - _assemblies.ScanForStructureMapObjects(this); - } + _assemblies.ScanForAll(this); - foreach (PluginFamily family in _pluginFamilies.All) - { - family.Seal(); - } + _pluginFamilies.Each(family => family.AddTypes(_pluggedTypes)); + _pluginFamilies.Each(family => family.Seal()); _profileManager.Seal(this); - - _sealed = true; } @@ -150,5 +138,15 @@ FindFamily(pluginType).AddInstance(instance); _profileManager.SetDefault(profileName, pluginType, instance); } + + public void AddType(Type pluginType, Type concreteType) + { + FindFamily(pluginType).AddType(concreteType); + } + + public void AddType(Type pluggedType) + { + _pluggedTypes.Add(pluggedType); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Graph/TypeRules.cs =================================================================== --- trunk/Source/StructureMap/Graph/TypeRules.cs 2008-09-30 18:00:10 UTC (rev 158) +++ trunk/Source/StructureMap/Graph/TypeRules.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -62,7 +62,7 @@ protected bool IsPrimitive(Type type) { - return type.IsPrimitive && !IsString(type); + return type.IsPrimitive && !IsString(type) && type != typeof(IntPtr); } protected bool IsSimple(Type type) Modified: trunk/Source/StructureMap/InstanceFactory.cs =================================================================== --- trunk/Source/StructureMap/InstanceFactory.cs 2008-09-30 18:00:10 UTC (rev 158) +++ trunk/Source/StructureMap/InstanceFactory.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -1,5 +1,6 @@ using System; using System.Collections; +using System.Collections.Generic; using StructureMap.Graph; using StructureMap.Pipeline; using StructureMap.Util; Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs 2008-09-30 18:00:10 UTC (rev 158) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -35,14 +35,14 @@ validateTypeIsArray<PLUGINTYPE>(); ChildArrayExpression expression = - new ChildArrayExpression(this, propertyName, typeof (PLUGINTYPE)); + new ChildArrayExpression(this, propertyName); return expression; } - public ChildArrayExpression ChildArray(string propertyName, Type childType) + public ChildArrayExpression ChildArray(string propertyName) { - return new ChildArrayExpression(this, propertyName, childType); + return new ChildArrayExpression(this, propertyName); } public ChildArrayExpression ChildArray<PLUGINTYPE>() @@ -104,16 +104,13 @@ public class ChildArrayExpression { - private readonly Type _childType; private readonly ConfiguredInstance _instance; private readonly string _propertyName; - public ChildArrayExpression(ConfiguredInstance instance, string propertyName, Type childType) + public ChildArrayExpression(ConfiguredInstance instance, string propertyName) { _instance = instance; _propertyName = propertyName; - - _childType = _childType; } public ConfiguredInstance Contains(params Instance[] instances) Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs 2008-09-30 18:00:10 UTC (rev 158) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -6,6 +6,11 @@ { public partial class ConfiguredInstance : ConfiguredInstanceBase<ConfiguredInstance> { + public static Type GetGenericType(Type templateType, params Type[] types) + { + return templateType.MakeGenericType(types); + } + public ConfiguredInstance(InstanceMemento memento, PluginGraph graph, Type pluginType) : base(memento, graph, pluginType) { } @@ -19,6 +24,11 @@ { } + public ConfiguredInstance(Type templateType, params Type[] types) : base(GetGenericType(templateType, types)) + { + + } + #region IStructuredInstance Members #endregion Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs 2008-09-30 18:00:10 UTC (rev 158) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -162,7 +162,7 @@ bool IConfiguredInstance.HasProperty(string propertyName) { - return _properties.ContainsKey(propertyName) || _children.ContainsKey(propertyName) || _arrays.ContainsKey(propertyName); + return _properties.ContainsKey(propertyName) || _children.ContainsKey(propertyName) || _arrays.ContainsKey(propertyName); } protected override Type getConcreteType(Type pluginType) @@ -198,6 +198,7 @@ protected void setProperty(string propertyName, string propertyValue) { + if (string.IsNullOrEmpty(propertyValue)) return; _properties[propertyName] = propertyValue; } Modified: trunk/Source/StructureMap/Pipeline/ProfileManager.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ProfileManager.cs 2008-09-30 18:00:10 UTC (rev 158) +++ trunk/Source/StructureMap/Pipeline/ProfileManager.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -203,7 +203,14 @@ pair.Value.CopyDefault(basicType, templatedType, family); } - CurrentProfile = CurrentProfile; + if (!string.IsNullOrEmpty(CurrentProfile)) + { + Profile theSourceProfile = getProfile(CurrentProfile); + theSourceProfile.FillAllTypesInto(_currentProfile); + } + + _default.FillAllTypesInto(_currentProfile); + } public void ImportFrom(ProfileManager source) Modified: trunk/Source/StructureMap/Pipeline/SmartInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/SmartInstance.cs 2008-09-30 18:00:10 UTC (rev 158) +++ trunk/Source/StructureMap/Pipeline/SmartInstance.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -146,6 +146,13 @@ return _instance; } + + public SmartInstance<T> Contains(Instance[] arrayInstances) + { + _instance.setChildArray(_propertyName, arrayInstances); + + return _instance; + } } public class DependencyExpression<T, CHILD> @@ -166,6 +173,17 @@ return _instance; } + + public SmartInstance<T> Is(Instance instance) + { + _instance.setChild(_propertyName, instance); + return _instance; + } + + public SmartInstance<T> Is(CHILD value) + { + return Is(new LiteralInstance(value)); + } } } Modified: trunk/Source/StructureMap/StructureMap.csproj =================================================================== --- trunk/Source/StructureMap/StructureMap.csproj 2008-09-30 18:00:10 UTC (rev 158) +++ trunk/Source/StructureMap/StructureMap.csproj 2008-10-01 15:53:44 UTC (rev 159) @@ -403,7 +403,11 @@ <Compile Include="Diagnostics\ValidationError.cs" /> <Compile Include="Emitting\Parameters\Methods.cs" /> <Compile Include="ErrorMessages.cs" /> + <Compile Include="Graph\FamilyAttributeScanner.cs" /> + <Compile Include="Graph\FindAllTypesFilter.cs" /> + <Compile Include="Graph\FindRegistriesScanner.cs" /> <Compile Include="Graph\ITypeScanner.cs" /> + <Compile Include="Graph\PluggableAttributeScanner.cs" /> <Compile Include="Graph\PluginCache.cs" /> <Compile Include="IBootstrapper.cs" /> <Compile Include="InitializationExpression.cs" /> Modified: trunk/Source/StructureMap/StructureMapConfiguration.cs =================================================================== --- trunk/Source/StructureMap/StructureMapConfiguration.cs 2008-09-30 18:00:10 UTC (rev 158) +++ trunk/Source/StructureMap/StructureMapConfiguration.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -92,7 +92,7 @@ /// Returns the path to the StructureMap.config file /// </summary> /// <returns></returns> - internal static string GetStructureMapConfigurationPath() + public static string GetStructureMapConfigurationPath() { string basePath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase; string configPath = Path.Combine(basePath, CONFIG_FILE_NAME); Modified: trunk/Source/StructureMap.Testing/GenericsAcceptanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/GenericsAcceptanceTester.cs 2008-09-30 18:00:10 UTC (rev 158) +++ trunk/Source/StructureMap.Testing/GenericsAcceptanceTester.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -20,6 +20,8 @@ #endregion + + [Test] public void BuildFamilyAndPluginThenSealAndCreateInstanceManagerWithGenericTypeWithOpenGenericParameters() { Modified: trunk/Source/StructureMap.Testing/Graph/ArrayConstructorTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/ArrayConstructorTester.cs 2008-09-30 18:00:10 UTC (rev 158) +++ trunk/Source/StructureMap.Testing/Graph/ArrayConstructorTester.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -1,8 +1,4 @@ using NUnit.Framework; -using StructureMap.Configuration; -using StructureMap.Configuration.DSL; -using StructureMap.Diagnostics; -using StructureMap.Graph; using StructureMap.Source; using StructureMap.Testing.TestData; using StructureMap.Testing.Widget; @@ -26,35 +22,26 @@ public void BuildDecisionWithRules() { // May need to add a Plugin for Decision to Decision labelled "Default" - DataMother.WriteDocument("FullTesting.XML"); DataMother.WriteDocument("Array.xml"); DataMother.WriteDocument("ObjectMother.config"); - Registry registry = new Registry(); XmlMementoSource source = new XmlFileMementoSource("Array.xml", string.Empty, "Decision"); - registry.ForRequestedType<Decision>().AddInstancesFrom(source); - PluginGraphBuilder builder = - new PluginGraphBuilder(new ConfigurationParser[] {ConfigurationParser.FromFile("ObjectMother.config")}, - new Registry[] {registry}, new GraphLog()); + var container = new Container(x => + { + x.AddConfigurationFromXmlFile("ObjectMother.config"); + x.ForRequestedType<Decision>().AddInstancesFrom(source); + }); - PluginGraph graph = builder.Build(); + container.GetInstance<Decision>("RedBlue").Rules.Length.ShouldEqual(2); - Container manager = new Container(graph); + var d2 = container.GetInstance(typeof (Decision), "GreenBluePurple").ShouldBeOfType<Decision>(); + d2.Rules.Length.ShouldEqual(3); - Decision d1 = manager.GetInstance<Decision>("RedBlue"); - Assert.IsNotNull(d1); - Assert.AreEqual(2, d1.Rules.Length, "2 Rules"); - - Decision d2 = (Decision) manager.GetInstance(typeof (Decision), "GreenBluePurple"); - Assert.IsNotNull(d2); - Assert.AreEqual(3, d2.Rules.Length, "3 Rules"); - - - Assert.AreEqual("Green", ((ColorRule) d2.Rules[0]).Color); - Assert.AreEqual("Blue", ((ColorRule) d2.Rules[1]).Color); - Assert.AreEqual("Purple", ((ColorRule) d2.Rules[2]).Color); + d2.Rules[0].ShouldBeOfType<ColorRule>().Color.ShouldEqual("Green"); + d2.Rules[1].ShouldBeOfType<ColorRule>().Color.ShouldEqual("Blue"); + d2.Rules[2].ShouldBeOfType<ColorRule>().Color.ShouldEqual("Purple"); } } } \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Graph/DefaultConventionScanningTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/DefaultConventionScanningTester.cs 2008-09-30 18:00:10 UTC (rev 158) +++ trunk/Source/StructureMap.Testing/Graph/DefaultConventionScanningTester.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -23,16 +23,15 @@ [Test] public void Process_to_PluginGraph() { - Registry registry = new Registry(); + PluginGraph graph = new PluginGraph(); DefaultConventionScanner scanner = new DefaultConventionScanner(); - scanner.Process(typeof(Convention), registry); + scanner.Process(typeof(Convention), graph); - PluginGraph graph = registry.Build(); - Assert.IsFalse(graph.PluginFamilies.Contains(typeof(IServer))); Assert.IsTrue(graph.PluginFamilies.Contains(typeof(IConvention))); PluginFamily family = graph.FindFamily(typeof (IConvention)); + family.Seal(); Assert.AreEqual(1, family.InstanceCount); } Modified: trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs 2008-09-30 18:00:10 UTC (rev 158) +++ trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -288,9 +288,13 @@ [Test] public void pass_explicit_service_into_all_instances() { + // The Container is constructed with 2 instances + // of TradeView var container = new Container(r => { - r.ForRequestedType<TradeView>().TheDefaultIsConcreteType<TradeView>().AddConcreteType<SecuredTradeView>(); + r.ForRequestedType<TradeView>() + .TheDefaultIsConcreteType<TradeView>() + .AddConcreteType<SecuredTradeView>(); }); Trade theTrade = new Trade(); @@ -300,6 +304,17 @@ views[0].Trade.ShouldBeTheSameAs(theTrade); views[1].Trade.ShouldBeTheSameAs(theTrade); } + + [Test] + public void Example() + { + IContainer container = new Container(); + Trade theTrade = new Trade(); + + var view = container.With<Trade>(theTrade).GetInstance<TradeView>(); + + view.Trade.ShouldBeTheSameAs(theTrade); + } } public class Lump Modified: trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs 2008-09-30 18:00:10 UTC (rev 158) +++ trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -1,4 +1,6 @@ using System; +using System.Collections.Generic; +using System.Data; using System.Reflection; using NUnit.Framework; using StructureMap.Attributes; @@ -6,6 +8,7 @@ using StructureMap.Pipeline; using StructureMap.Testing.Widget; using StructureMap.Testing.Widget3; +using Rule=StructureMap.Testing.Widget.Rule; namespace StructureMap.Testing.Graph { @@ -30,93 +33,83 @@ } [Test] - public void AddAPluggedType() + public void add_type_does_not_add_if_the_concrete_type_can_not_be_cast_to_plugintype() { - PluginFamily family = new PluginFamily(typeof (IWidget)); - family.DefaultInstanceKey = "DefaultKey"; - family.AddPlugin(typeof (NotPluggableWidget), "NotPlugged"); + var family = new PluginFamily(typeof(IServiceProvider)); + family.AddType(this.GetType()); - Assert.AreEqual(1, family.PluginCount, "Plugin Count"); + family.PluginCount.ShouldEqual(0); } - [Test, ExpectedException(typeof (StructureMapException))] - public void AddAWrongType() - { - PluginFamily family = new PluginFamily(typeof (IWidget)); - family.DefaultInstanceKey = "DefaultKey"; - family.AddPlugin(typeof (Rule), "Rule"); - } - - [Test] - public void Analyze_a_type_for_a_plugin_that_does_not_match() + public void add_type_works_if_the_concrete_type_can_be_cast_to_plugintype() { - PluginFamily family = new PluginFamily(typeof (ISingletonRepository)); - family.AnalyzeTypeForPlugin(typeof (RandomClass)); + var family = new PluginFamily(typeof (IServiceProvider)); - Assert.AreEqual(0, family.PluginCount); + family.AddType(typeof(DataTable)); + family.PluginCount.ShouldEqual(1); + + family.AddType(typeof(DataTable)); + family.PluginCount.ShouldEqual(1); } [Test] - public void - Analyze_a_type_for_a_plugin_that_is_not_explicitly_marked_when_the_family_is_not_considering_implicit_plugins - () + public void add_plugins_at_seal_from_the_list_of_types() { - PluginFamily family = new PluginFamily(typeof (ISingletonRepository)); - family.SearchForImplicitPlugins = false; + var family = new PluginFamily(typeof(IServiceProvider)); + family.AddType(typeof(DataTable)); - family.AnalyzeTypeForPlugin(typeof (SingletonRepositoryWithoutPluginAttribute)); + // DataView, DataSet, and DataTable are all IServiceProvider implementations, and should get added + // to the PluginFamily + List<Type> pluggedTypes = new List<Type>(){typeof(DataView), typeof(DataSet), typeof(DataTable), GetType()}; + + family.AddTypes(pluggedTypes); - Assert.AreEqual(0, family.PluginCount); + family.PluginCount.ShouldEqual(3); + + family.FindPlugin(typeof(DataView)).ShouldNotBeNull(); + family.FindPlugin(typeof(DataTable)).ShouldNotBeNull(); + family.FindPlugin(typeof(DataSet)).ShouldNotBeNull(); } [Test] - public void Analyze_a_type_for_implicit_plugins() + public void AddAPluggedType() { - PluginFamily family = new PluginFamily(typeof (ISingletonRepository)); - family.SearchForImplicitPlugins = true; + var family = new PluginFamily(typeof (IWidget)); + family.DefaultInstanceKey = "DefaultKey"; + family.AddPlugin(typeof (NotPluggableWidget), "NotPlugged"); - family.AnalyzeTypeForPlugin(typeof (SingletonRepositoryWithoutPluginAttribute)); + Assert.AreEqual(1, family.PluginCount, "Plugin Count"); + } - Assert.AreEqual(1, family.PluginCount); - Assert.IsTrue(family.HasPlugin(typeof (SingletonRepositoryWithoutPluginAttribute))); + [Test, ExpectedException(typeof (StructureMapException))] + public void AddAWrongType() + { + var family = new PluginFamily(typeof (IWidget)); + family.DefaultInstanceKey = "DefaultKey"; + family.AddPlugin(typeof (Rule), "Rule"); } [Test] public void Create_PluginFamily_for_concrete_type_that_can_be_autofilled_and_create_default_instance() { - PluginFamily family = new PluginFamily(GetType()); + var family = new PluginFamily(GetType()); family.Seal(); Assert.AreEqual(Plugin.DEFAULT, family.DefaultInstanceKey); Assert.AreEqual(1, family.PluginCount); Assert.AreEqual(1, family.InstanceCount); - IConfiguredInstance instance = (IConfiguredInstance) family.FirstInstance(); + var instance = (IConfiguredInstance) family.FirstInstance(); Assert.AreEqual(Plugin.DEFAULT, instance.Name); Assert.AreEqual(GetType(), instance.PluggedType); } [Test] - public void Do_not_add_Plugin_that_already_exists() - { - PluginFamily family = new PluginFamily(typeof (ISingletonRepository)); - family.AddPlugin(typeof (SingletonRepositoryWithAttribute)); - - - family.AnalyzeTypeForPlugin(typeof (SingletonRepositoryWithAttribute)); - family.AnalyzeTypeForPlugin(typeof (SingletonRepositoryWithAttribute)); - family.AnalyzeTypeForPlugin(typeof (SingletonRepositoryWithAttribute)); - family.AnalyzeTypeForPlugin(typeof (SingletonRepositoryWithAttribute)); - - Assert.AreEqual(1, family.PluginCount); - } - - [Test] public void FillDefault_happy_path() { - PluginFamily family = new PluginFamily(typeof (IWidget)); + var family = new PluginFamily(typeof (IWidget)); family.Parent = new PluginGraph(); - family.AddInstance(new ConfiguredInstance(typeof(ColorWidget)).WithName("Default")); + family.AddInstance(new ConfiguredInstance(typeof (ColorWidget)).WithName("Default")); family.DefaultInstanceKey = "Default"; @@ -128,7 +121,7 @@ [Test] public void FillDefault_sad_path_when_the_default_instance_key_does_not_exist_throws_210() { - PluginFamily family = new PluginFamily(typeof (IWidget)); + var family = new PluginFamily(typeof (IWidget)); family.Parent = new PluginGraph(); family.DefaultInstanceKey = "something that cannot be found"; @@ -140,9 +133,9 @@ [Test] public void If_PluginFamily_only_has_one_instance_make_that_the_default() { - PluginFamily family = new PluginFamily(typeof (IGateway)); + var family = new PluginFamily(typeof (IGateway)); string theInstanceKey = "the default"; - family.AddInstance(new ConfiguredInstance(typeof(TheGateway)).WithName(theInstanceKey)); + family.AddInstance(new ConfiguredInstance(typeof (TheGateway)).WithName(theInstanceKey)); family.Seal(); @@ -152,7 +145,7 @@ [Test] public void If_PluginType_is_concrete_automatically_add_a_plugin_called_default() { - PluginFamily family = new PluginFamily(GetType()); + var family = new PluginFamily(GetType()); family.PluginCount.ShouldEqual(1); family.FindPlugin(Plugin.DEFAULT).PluggedType.ShouldEqual(GetType()); } @@ -160,10 +153,10 @@ [Test] public void ImplicitPluginFamilyCreatesASingletonInterceptorWhenIsSingletonIsTrue() { - PluginFamily family = new PluginFamily(typeof (ISingletonRepository)); + var family = new PluginFamily(typeof (ISingletonRepository)); Assert.IsInstanceOfType(typeof (SingletonPolicy), family.Policy); - PluginFamily family2 = new PluginFamily(typeof (IDevice)); + var family2 = new PluginFamily(typeof (IDevice)); Assert.IsInstanceOfType(typeof (BuildPolicy), family2.Policy); } @@ -172,8 +165,8 @@ { TestUtility.AssertErrorIsLogged(104, graph => { - PluginFamily family = new PluginFamily(typeof (IGateway), graph); - ConfiguredInstance instance = new ConfiguredInstance(typeof (ColorRule)); + var family = new PluginFamily(typeof (IGateway), graph); + var instance = new ConfiguredInstance(typeof (ColorRule)); Assert.IsFalse(TypeRules.CanBeCast(typeof (IGateway), typeof (Rule))); @@ -184,41 +177,23 @@ } [Test] - public void PluginFamily_adds_an_explicitly_marked_Plugin_when_only_looking_for_Explicit_plugins() - { - PluginFamily family = new PluginFamily(typeof (ISingletonRepository)); - family.SearchForImplicitPlugins = false; - family.AnalyzeTypeForPlugin(typeof (SingletonRepositoryWithAttribute)); - - Assert.AreEqual(1, family.PluginCount); - Assert.IsTrue(family.HasPlugin(typeof (SingletonRepositoryWithAttribute))); - } - - [Test] - public void PluginFamily_only_looks_for_explicit_plugins_by_default() - { - PluginFamily family = new PluginFamily(typeof (ISingletonRepository)); - Assert.IsFalse(family.SearchForImplicitPlugins); - } - - [Test] public void PluginFamilyImplicitlyConfiguredAsASingletonBehavesAsASingleton() { - PluginGraph pluginGraph = new PluginGraph(); + var pluginGraph = new PluginGraph(); pluginGraph.Assemblies.Add(Assembly.GetExecutingAssembly()); pluginGraph.Seal(); - Container manager = new Container(pluginGraph); + var manager = new Container(pluginGraph); - ISingletonRepository repository1 = + var repository1 = (ISingletonRepository) manager.GetInstance(typeof (ISingletonRepository)); - ISingletonRepository repository2 = + var repository2 = (ISingletonRepository) manager.GetInstance(typeof (ISingletonRepository)); - ISingletonRepository repository3 = + var repository3 = (ISingletonRepository) manager.GetInstance(typeof (ISingletonRepository)); - ISingletonRepository repository4 = + var repository4 = (ISingletonRepository) manager.GetInstance(typeof (ISingletonRepository)); - ISingletonRepository repository5 = + var repository5 = (ISingletonRepository) manager.GetInstance(typeof (ISingletonRepository)); Assert.AreSame(repository1, repository2); @@ -230,7 +205,7 @@ [Test] public void SetScopeToHttpContext() { - PluginFamily family = new PluginFamily(typeof (IServiceProvider)); + var family = new PluginFamily(typeof (IServiceProvider)); Assert.IsInstanceOfType(typeof (BuildPolicy), family.Policy); family.SetScopeTo(InstanceScope.HttpContext); @@ -241,7 +216,7 @@ [Test] public void SetScopeToHybrid() { - PluginFamily family = new PluginFamily(typeof (IServiceProvider)); + var family = new PluginFamily(typeof (IServiceProvider)); Assert.IsInstanceOfType(typeof (BuildPolicy), family.Policy); family.SetScopeTo(InstanceScope.Hybrid); @@ -251,7 +226,7 @@ [Test] public void SetScopeToSingleton() { - PluginFamily family = new PluginFamily(typeof (IServiceProvider)); + var family = new PluginFamily(typeof (IServiceProvider)); Assert.IsInstanceOfType(typeof (BuildPolicy), family.Policy); family.SetScopeTo(InstanceScope.Singleton); @@ -261,7 +236,7 @@ [Test] public void SetScopeToThreadLocal() { - PluginFamily family = new PluginFamily(typeof (IServiceProvider)); + var family = new PluginFamily(typeof (IServiceProvider)); Assert.IsInstanceOfType(typeof (BuildPolicy), family.Policy); family.SetScopeTo(InstanceScope.ThreadLocal); Modified: trunk/Source/StructureMap.Testing/Graph/PluginGraphTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/PluginGraphTester.cs 2008-09-30 18:00:10 UTC (rev 158) +++ trunk/Source/StructureMap.Testing/Graph/PluginGraphTester.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -114,6 +114,22 @@ graph.Seal(); } + + [Test] + public void add_type_adds_a_plugin_for_type_once_and_only_once() + { + var graph = new PluginGraph(); + + graph.AddType(typeof (IThingy), typeof (BigThingy)); + + var family = graph.FindFamily(typeof (IThingy)); + family.PluginCount.ShouldEqual(1); + family.FindPlugin(typeof(BigThingy)).ShouldNotBeNull(); + + graph.AddType(typeof(IThingy), typeof(BigThingy)); + + family.PluginCount.ShouldEqual(1); + } } [PluginFamily] Modified: trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs 2008-09-30 18:00:10 UTC (rev 158) +++ trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -4,6 +4,7 @@ using StructureMap.Configuration.DSL; using StructureMap.Graph; using StructureMap.Pipeline; +using StructureMap.Testing.GenericWidgets; using StructureMap.Testing.Widget; using StructureMap.Testing.Widget2; using StructureMap.Testing.Widget3; @@ -50,6 +51,15 @@ } [Test] + public void can_use_a_configured_instance_with_generic_template_type_and_arguments() + { + var instance = new ConfiguredInstance(typeof (Service2<>), typeof (string)); + Container container = new Container(); + + container.GetInstance<IService<string>>(instance).ShouldBeOfType(typeof(Service2<string>)); + } + + [Test] public void get_the_concrete_type_from_diagnostic_instance() { var instance = new ConfiguredInstance(typeof (ColorRule)) as IDiagnosticInstance; Modified: trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs 2008-09-30 18:00:10 UTC (rev 158) +++ trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -135,9 +135,6 @@ PluggedType='StructureMap.Testing.Pipeline.ClassWithDependency, StructureMap.Testing'> <Rule PluggedType='StructureMap.Testing.Widget.ColorRule, StructureMap.Testing.Widget' color='Red' /> - - - </DefaultInstance> </StructureMap> Modified: trunk/Source/StructureMap.Testing/SpecificationExtensions.cs =================================================================== --- trunk/Source/StructureMap.Testing/SpecificationExtensions.cs 2008-09-30 18:00:10 UTC (rev 158) +++ trunk/Source/StructureMap.Testing/SpecificationExtensions.cs 2008-10-01 15:53:44 UTC (rev 159) @@ -63,6 +63,12 @@ Assert.IsInstanceOfType(expected, actual); } + public static T ShouldBeOfType<T>(this object actual) + { + Assert.IsInstanceOfType(typeof(T), actual); + return (T) actual; + } + public static void ShouldNotBeOfType(this object actual, Type expected) { Assert.IsNotInstanceOfType(expected, actual); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2008-10-01 18:30:02
|
Revision: 160 http://structuremap.svn.sourceforge.net/structuremap/?rev=160&view=rev Author: jeremydmiller Date: 2008-10-01 18:29:38 +0000 (Wed, 01 Oct 2008) Log Message: ----------- type scanning overhaul part #1 Modified Paths: -------------- trunk/Source/StructureMap/Configuration/DSL/Registry.cs trunk/Source/StructureMap/Configuration/GraphBuilder.cs trunk/Source/StructureMap/Graph/AssemblyScanner.cs trunk/Source/StructureMap/Graph/PluginGraph.cs trunk/Source/StructureMap/StructureMap.csproj trunk/Source/StructureMap/StructureMapConfiguration.cs trunk/Source/StructureMap.Testing/Configuration/DSL/AddInstanceTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryIntegratedTester.cs trunk/Source/StructureMap.Testing/Configuration/IncludeTesting.cs trunk/Source/StructureMap.Testing/Configuration/NormalGraphBuilderTester.cs trunk/Source/StructureMap.Testing/DataAccess/Debugging.cs trunk/Source/StructureMap.Testing/GenericsAcceptanceTester.cs trunk/Source/StructureMap.Testing/Graph/ArrayConstructorTester.cs trunk/Source/StructureMap.Testing/Graph/ContainerTester.cs trunk/Source/StructureMap.Testing/Graph/DefaultConventionScanningTester.cs trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs trunk/Source/StructureMap.Testing/Graph/FillDependenciesTester.cs trunk/Source/StructureMap.Testing/Graph/InstanceFactoryTester.cs trunk/Source/StructureMap.Testing/Graph/IntegratedTester.cs trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs trunk/Source/StructureMap.Testing/Graph/PluginGraphBuilderTester.cs trunk/Source/StructureMap.Testing/Graph/PluginGraphTester.cs trunk/Source/StructureMap.Testing/Graph/PluginTester.cs trunk/Source/StructureMap.Testing/Graph/TypeFindingTester.cs trunk/Source/StructureMap.Testing/ObjectFactoryInitializeTester.cs trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj trunk/Source/StructureMap.Testing/StructureMapConfigurationDefensiveChecksTester.cs Removed Paths: ------------- trunk/Source/StructureMap/Configuration/DSL/Expressions/ScanAssembliesExpression.cs trunk/Source/StructureMap.Testing/Configuration/DSL/ScanAssembliesTester.cs trunk/Source/StructureMap.Testing/ObjectMother.cs Deleted: trunk/Source/StructureMap/Configuration/DSL/Expressions/ScanAssembliesExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/ScanAssembliesExpression.cs 2008-10-01 15:53:44 UTC (rev 159) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/ScanAssembliesExpression.cs 2008-10-01 18:29:38 UTC (rev 160) @@ -1,123 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Reflection; -using System.Threading; -using StructureMap.Graph; - -namespace StructureMap.Configuration.DSL.Expressions -{ - /// <summary> - /// Expression that directs StructureMap to scan the named assemblies - /// for [PluginFamily] and [Plugin] attributes - /// </summary> - public class ScanAssembliesExpression - { - private readonly List<Assembly> _assemblies = new List<Assembly>(); - private readonly Registry _registry; - - public ScanAssembliesExpression(Registry registry) - { - _registry = registry; - _registry.addExpression(graph => - { - foreach (Assembly assembly in _assemblies) - { - graph.Assemblies.Add(assembly); - } - }); - } - - public ScanAssembliesExpression IncludeTheCallingAssembly() - { - Assembly callingAssembly = findTheCallingAssembly(); - - if (callingAssembly != null) - { - _assemblies.Add(callingAssembly); - } - - return this; - } - - private static Assembly findTheCallingAssembly() - { - StackTrace trace = new StackTrace(Thread.CurrentThread, false); - - Assembly thisAssembly = Assembly.GetExecutingAssembly(); - Assembly callingAssembly = null; - for (int i = 0; i < trace.FrameCount; i++) - { - StackFrame frame = trace.GetFrame(i); - Assembly assembly = frame.GetMethod().DeclaringType.Assembly; - if (assembly != thisAssembly) - { - callingAssembly = assembly; - break; - } - } - return callingAssembly; - } - - public ScanAssembliesExpression IncludeAssemblyContainingType<T>() - { - _assemblies.Add(typeof (T).Assembly); - - return this; - } - - public ScanAssembliesExpression IncludeAssemblyContainingType(Type type) - { - _assemblies.Add(type.Assembly); - - return this; - } - - public ScanAssembliesExpression AddAllTypesOf<PLUGINTYPE>() - { - return AddAllTypesOf(typeof (PLUGINTYPE)); - } - - public ScanAssembliesExpression AddAllTypesOf(Type pluginType) - { - _registry.addExpression(pluginGraph => - { - pluginGraph.Assemblies.AddScanner(new FindAllTypesFilter(pluginType)); - }); - - return this; - } - - public ScanAssembliesExpression IncludeAssembly(string assemblyName) - { - Assembly assembly = AppDomain.CurrentDomain.Load(assemblyName); - _assemblies.Add(assembly); - - return this; - } - - public ScanAssembliesExpression With(ITypeScanner scanner) - { - _registry.addExpression(graph => graph.Assemblies.AddScanner(scanner)); - - - return this; - } - - public ScanAssembliesExpression With<T>() where T : ITypeScanner, new() - { - _registry.addExpression(graph => graph.Assemblies.AddScanner<T>()); - return this; - } - - // TODO: Need a test here - public ScanAssembliesExpression With<T>(Action<T> configure) where T : ITypeScanner, new() - { - T scanner = new T(); - configure(scanner); - - _registry.addExpression(graph => graph.Assemblies.AddScanner(scanner)); - return this; - } - } -} \ No newline at end of file Modified: trunk/Source/StructureMap/Configuration/DSL/Registry.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2008-10-01 15:53:44 UTC (rev 159) +++ trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2008-10-01 18:29:38 UTC (rev 160) @@ -137,9 +137,12 @@ /// Programmatically determine Assembly's to be scanned for attribute configuration /// </summary> /// <returns></returns> - public ScanAssembliesExpression ScanAssemblies() + public void Scan(Action<AssemblyScanner> action) { - return new ScanAssembliesExpression(this); + var scanner = new AssemblyScanner(); + action(scanner); + + _actions.Add(graph => graph.AddScanner(scanner)); } [Obsolete("Like to get rid of this")] Modified: trunk/Source/StructureMap/Configuration/GraphBuilder.cs =================================================================== --- trunk/Source/StructureMap/Configuration/GraphBuilder.cs 2008-10-01 15:53:44 UTC (rev 159) +++ trunk/Source/StructureMap/Configuration/GraphBuilder.cs 2008-10-01 18:29:38 UTC (rev 160) @@ -1,7 +1,6 @@ using System; using System.Reflection; using StructureMap.Configuration.DSL; -using StructureMap.Diagnostics; using StructureMap.Graph; using StructureMap.Pipeline; @@ -9,8 +8,10 @@ { public class GraphBuilder : IGraphBuilder { + private readonly AssemblyScanner _assemblyScanner; private readonly PluginGraph _pluginGraph; private readonly PluginGraph _systemGraph; + private readonly AssemblyScanner _systemScanner; private Profile _profile; private Container _systemContainer; @@ -22,16 +23,19 @@ public GraphBuilder(Registry[] registries, PluginGraph pluginGraph) { _pluginGraph = pluginGraph; + _assemblyScanner = new AssemblyScanner(); + _pluginGraph.AddScanner(_assemblyScanner); + foreach (Registry registry in registries) { registry.ConfigurePluginGraph(_pluginGraph); } - AssemblyScanner scanner = new AssemblyScanner(new GraphLog()); - scanner.Add(Assembly.GetExecutingAssembly()); - scanner.IgnoreRegistries(); + _systemScanner = new AssemblyScanner(); + _systemScanner.Assembly(Assembly.GetExecutingAssembly()); + _systemScanner.IgnoreRegistries(); - _systemGraph = new PluginGraph(scanner); + _systemGraph = new PluginGraph(_systemScanner); } #region IGraphBuilder Members @@ -56,8 +60,8 @@ try { Assembly assembly = AppDomain.CurrentDomain.Load(assemblyName); - _pluginGraph.Assemblies.Add(assembly); - _systemGraph.Assemblies.Add(assembly); + _assemblyScanner.Assembly(assembly); + _systemScanner.Assembly(assembly); } catch (Exception ex) { @@ -94,7 +98,7 @@ { try { - T systemObject = (T) buildSystemObject(typeof (T), memento); + var systemObject = (T) buildSystemObject(typeof (T), memento); action(systemObject); } catch (Exception ex) Modified: trunk/Source/StructureMap/Graph/AssemblyScanner.cs =================================================================== --- trunk/Source/StructureMap/Graph/AssemblyScanner.cs 2008-10-01 15:53:44 UTC (rev 159) +++ trunk/Source/StructureMap/Graph/AssemblyScanner.cs 2008-10-01 18:29:38 UTC (rev 160) @@ -1,24 +1,23 @@ using System; using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; using System.Reflection; -using StructureMap.Configuration.DSL; +using System.Threading; using StructureMap.Diagnostics; -using System.Linq; namespace StructureMap.Graph { public class AssemblyScanner { private readonly List<Assembly> _assemblies = new List<Assembly>(); - private readonly GraphLog _log; private readonly List<ITypeScanner> _scanners = new List<ITypeScanner>(); - public AssemblyScanner(GraphLog log) + public AssemblyScanner() { - _log = log; - AddScanner<FamilyAttributeScanner>(); - AddScanner<PluggableAttributeScanner>(); - AddScanner<FindRegistriesScanner>(); + With<FamilyAttributeScanner>(); + With<PluggableAttributeScanner>(); + With<FindRegistriesScanner>(); } public int Count @@ -28,70 +27,26 @@ public void ScanForAll(PluginGraph pluginGraph) { - // Don't do this for SystemScan - scanTypes(type => - { - if (!Registry.IsPublicRegistry(type)) return; - - foreach (var previous in pluginGraph.Registries) - { - if (previous.GetType().Equals(type)) - { - return; - } - } - - Registry registry = (Registry) Activator.CreateInstance(type); - registry.ConfigurePluginGraph(pluginGraph); - }); - - runScanners(pluginGraph); + _assemblies.ForEach(assem => scanTypesInAssembly(assem, pluginGraph)); } - private void runScanners(PluginGraph graph) + private void scanTypesInAssembly(Assembly assembly, PluginGraph graph) { - scanTypes(type => _scanners.ForEach(scanner => scanner.Process(type, graph))); - } - - public void ScanForStructureMapObjects(PluginGraph pluginGraph) - { - // I think this just needs to look for attributes only - throw new NotImplementedException(); - } - - private void scanTypes(Action<Type> action) - { - scanTypes(new[] {action}); - } - - private void scanTypes(IEnumerable<Action<Type>> actions) - { - foreach (Assembly assembly in _assemblies.ToArray()) - { - scanTypesInAssembly(assembly, actions); - } - } - - private void scanTypesInAssembly(Assembly assembly, IEnumerable<Action<Type>> actions) - { Type[] exportedTypes; try { foreach (Type type in assembly.GetExportedTypes()) { - foreach (Action<Type> action in actions) - { - action(type); - } + _scanners.ForEach(scanner => scanner.Process(type, graph)); } } catch (Exception ex) { - _log.RegisterError(170, ex, assembly.FullName); + graph.Log.RegisterError(170, ex, assembly.FullName); } } - public void Add(Assembly assembly) + public void Assembly(Assembly assembly) { if (!_assemblies.Contains(assembly)) { @@ -99,9 +54,9 @@ } } - public void Add(string assemblyName) + public void Assembly(string assemblyName) { - Add(AppDomain.CurrentDomain.Load(assemblyName)); + Assembly(AppDomain.CurrentDomain.Load(assemblyName)); } public bool Contains(string assemblyName) @@ -117,19 +72,19 @@ return false; } - public void AddScanner(ITypeScanner scanner) + public void With(ITypeScanner scanner) { if (_scanners.Contains(scanner)) return; _scanners.Add(scanner); } - public void AddScanner<T>() where T : ITypeScanner, new() + public void With<T>() where T : ITypeScanner, new() { - var previous = _scanners.FirstOrDefault(scanner => scanner is T); + ITypeScanner previous = _scanners.FirstOrDefault(scanner => scanner is T); if (previous == null) { - AddScanner(new T()); + With(new T()); } } @@ -137,5 +92,55 @@ { _scanners.RemoveAll(x => x is FindRegistriesScanner); } + + public void TheCallingAssembly() + { + Assembly callingAssembly = findTheCallingAssembly(); + + if (callingAssembly != null) + { + _assemblies.Add(callingAssembly); + } + } + + private static Assembly findTheCallingAssembly() + { + StackTrace trace = new StackTrace(Thread.CurrentThread, false); + + Assembly thisAssembly = System.Reflection.Assembly.GetExecutingAssembly(); + Assembly callingAssembly = null; + for (int i = 0; i < trace.FrameCount; i++) + { + StackFrame frame = trace.GetFrame(i); + Assembly assembly = frame.GetMethod().DeclaringType.Assembly; + if (assembly != thisAssembly) + { + callingAssembly = assembly; + break; + } + } + return callingAssembly; + } + + public void AssemblyContainingType<T>() + { + _assemblies.Add(typeof(T).Assembly); + } + + public void AssemblyContainingType(Type type) + { + _assemblies.Add(type.Assembly); + } + + public void AddAllTypesOf<PLUGINTYPE>() + { + AddAllTypesOf(typeof(PLUGINTYPE)); + } + + public void AddAllTypesOf(Type pluginType) + { + With(new FindAllTypesFilter(pluginType)); + } + } } \ No newline at end of file Modified: trunk/Source/StructureMap/Graph/PluginGraph.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginGraph.cs 2008-10-01 15:53:44 UTC (rev 159) +++ trunk/Source/StructureMap/Graph/PluginGraph.cs 2008-10-01 18:29:38 UTC (rev 160) @@ -16,41 +16,48 @@ [Serializable] public class PluginGraph { - private readonly AssemblyScanner _assemblies; private readonly InterceptorLibrary _interceptorLibrary = new InterceptorLibrary(); - private GraphLog _log = new GraphLog(); + private readonly List<Type> _pluggedTypes = new List<Type>(); private readonly PluginFamilyCollection _pluginFamilies; private readonly ProfileManager _profileManager = new ProfileManager(); - private bool _sealed = false; private readonly List<Registry> _registries = new List<Registry>(); - private readonly List<Type> _pluggedTypes = new List<Type>(); - + private readonly List<AssemblyScanner> _scanners = new List<AssemblyScanner>(); + private GraphLog _log = new GraphLog(); + private bool _sealed; + /// <summary> /// Default constructor /// </summary> - public PluginGraph() : base() + public PluginGraph() { - _assemblies = new AssemblyScanner(_log); _pluginFamilies = new PluginFamilyCollection(this); } public PluginGraph(AssemblyScanner assemblies) { - _assemblies = assemblies; _pluginFamilies = new PluginFamilyCollection(this); + _scanners.Add(assemblies); } - public List<Registry> Registries + public void Scan(Action<AssemblyScanner> action) { - get { return _registries; } + var scanner = new AssemblyScanner(); + action(scanner); + + AddScanner(scanner); } - public AssemblyScanner Assemblies + public void ScanThisAssembly() { - get { return _assemblies; } + Scan(x => x.TheCallingAssembly()); } + public List<Registry> Registries + { + get { return _registries; } + } + public PluginFamilyCollection PluginFamilies { get { return _pluginFamilies; } @@ -95,7 +102,7 @@ return; } - _assemblies.ScanForAll(this); + _scanners.ForEach(scanner => scanner.ScanForAll(this)); _pluginFamilies.Each(family => family.AddTypes(_pluggedTypes)); _pluginFamilies.Each(family => family.Seal()); @@ -107,14 +114,19 @@ #endregion + public void AddScanner(AssemblyScanner scanner) + { + _scanners.Add(scanner); + } + public static PluginGraph BuildGraphFromAssembly(Assembly assembly) { - PluginGraph pluginGraph = new PluginGraph(); - pluginGraph.Assemblies.Add(assembly); + var graph = new PluginGraph(); + graph.Scan(x => x.Assembly(assembly)); - pluginGraph.Seal(); + graph.Seal(); - return pluginGraph; + return graph; } public PluginFamily FindFamily(Type pluginType) Modified: trunk/Source/StructureMap/StructureMap.csproj =================================================================== --- trunk/Source/StructureMap/StructureMap.csproj 2008-10-01 15:53:44 UTC (rev 159) +++ trunk/Source/StructureMap/StructureMap.csproj 2008-10-01 18:29:38 UTC (rev 160) @@ -218,7 +218,6 @@ <Compile Include="Pipeline\ExplicitArguments.cs" /> <Compile Include="Configuration\DSL\Expressions\ProfileExpression.cs" /> <Compile Include="Configuration\DSL\Registry.cs" /> - <Compile Include="Configuration\DSL\Expressions\ScanAssembliesExpression.cs" /> <Compile Include="Configuration\FamilyParser.cs"> <SubType>Code</SubType> </Compile> Modified: trunk/Source/StructureMap/StructureMapConfiguration.cs =================================================================== --- trunk/Source/StructureMap/StructureMapConfiguration.cs 2008-10-01 15:53:44 UTC (rev 159) +++ trunk/Source/StructureMap/StructureMapConfiguration.cs 2008-10-01 18:29:38 UTC (rev 160) @@ -167,9 +167,9 @@ /// Programmatically determine Assembly's to be scanned for attribute configuration /// </summary> /// <returns></returns> - public static ScanAssembliesExpression ScanAssemblies() + public static void Scan(Action<AssemblyScanner> action) { - return registry.ScanAssemblies(); + registry.Scan(action); } /// <summary> Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/AddInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/AddInstanceTester.cs 2008-10-01 15:53:44 UTC (rev 159) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/AddInstanceTester.cs 2008-10-01 18:29:38 UTC (rev 160) @@ -16,7 +16,7 @@ { container = new Container(registry => { - registry.ScanAssemblies().IncludeAssemblyContainingType<ColorWidget>(); + registry.Scan(x => x.AssemblyContainingType<ColorWidget>()); // Add an instance with properties registry.InstanceOf<IWidget>() @@ -64,8 +64,8 @@ { IContainer container = new Container( registry => registry.InstanceOf<Rule>().Is.OfConcreteType<WidgetRule>() - .WithName("AWidgetRule") - .CtorDependency<IWidget>().Is(i => i.OfConcreteType<AWidget>())); + .WithName("AWidgetRule") + .CtorDependency<IWidget>().Is(i => i.OfConcreteType<AWidget>())); container.GetInstance<Rule>("AWidgetRule") .IsType<WidgetRule>() @@ -124,9 +124,10 @@ IContainer manager = new Container( registry => registry.InstanceOf<Rule>().Is.OfConcreteType<WidgetRule>().WithName(instanceKey) - .CtorDependency<IWidget>().Is(i => i.OfConcreteType<ColorWidget>().WithCtorArg("color").EqualTo("Orange").WithName("Orange")) - - ); + .CtorDependency<IWidget>().Is( + i => + i.OfConcreteType<ColorWidget>().WithCtorArg("color").EqualTo("Orange").WithName("Orange")) + ); var rule = (WidgetRule) manager.GetInstance<Rule>(instanceKey); var widget = (ColorWidget) rule.Widget; @@ -178,7 +179,6 @@ } } - public class WidgetRule : Rule { Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs 2008-10-01 15:53:44 UTC (rev 159) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs 2008-10-01 18:29:38 UTC (rev 160) @@ -38,7 +38,7 @@ [Test] public void Add_an_instance_by_lambda() { - Container manager = + var manager = new Container( r => r.InstanceOf<IWidget>().Is.ConstructedBy(() => new AWidget())); @@ -48,9 +48,9 @@ [Test] public void Add_an_instance_by_literal() { - AWidget aWidget = new AWidget(); + var aWidget = new AWidget(); - Container manager = + var manager = new Container(registry => registry.InstanceOf<IWidget>().Is.Object(aWidget)); Assert.IsInstanceOfType(typeof (AWidget), manager.GetAllInstances<IWidget>()[0]); @@ -60,7 +60,8 @@ public void AddInstanceByNameOnlyAddsOneInstanceToStructureMap() { IContainer manager = new Container(registry => registry.ForRequestedType<Something>().AddInstance( - RegistryExpressions.Instance<RedSomething>().WithName("Red") + RegistryExpressions.Instance<RedSomething>().WithName( + "Red") )); IList<Something> instances = manager.GetAllInstances<Something>(); Assert.AreEqual(1, instances.Count); @@ -70,7 +71,8 @@ public void AddInstanceWithNameOnlyAddsOneInstanceToStructureMap() { IContainer manager = - new Container(registry => registry.InstanceOf<Something>().Is.OfConcreteType<RedSomething>().WithName("Red")); + new Container( + registry => registry.InstanceOf<Something>().Is.OfConcreteType<RedSomething>().WithName("Red")); IList<Something> instances = manager.GetAllInstances<Something>(); Assert.AreEqual(1, instances.Count); } @@ -78,7 +80,7 @@ [Test] public void AsAnotherScope() { - Registry registry = new Registry(); + var registry = new Registry(); CreatePluginFamilyExpression<IGateway> expression = registry.BuildInstancesOf<IGateway>().CacheBy(InstanceScope.ThreadLocal); Assert.IsNotNull(expression); @@ -92,7 +94,7 @@ [Test] public void BuildInstancesOfType() { - Registry registry = new Registry(); + var registry = new Registry(); registry.BuildInstancesOf<IGateway>(); PluginGraph pluginGraph = registry.Build(); @@ -103,7 +105,7 @@ [Test] public void BuildPluginFamilyAsPerRequest() { - Registry registry = new Registry(); + var registry = new Registry(); CreatePluginFamilyExpression<IGateway> expression = registry.BuildInstancesOf<IGateway>(); Assert.IsNotNull(expression); @@ -117,7 +119,7 @@ [Test] public void BuildPluginFamilyAsSingleton() { - Registry registry = new Registry(); + var registry = new Registry(); CreatePluginFamilyExpression<IGateway> expression = registry.BuildInstancesOf<IGateway>().AsSingletons(); Assert.IsNotNull(expression); @@ -130,15 +132,15 @@ [Test] public void CanOverrideTheDefaultInstance1() { - Registry registry = new Registry(); + var registry = new Registry(); // Specify the default implementation for an interface registry.BuildInstancesOf<IGateway>().TheDefaultIsConcreteType<StubbedGateway>(); PluginGraph pluginGraph = registry.Build(); Assert.IsTrue(pluginGraph.ContainsFamily(typeof (IGateway))); - Container manager = new Container(pluginGraph); - IGateway gateway = (IGateway) manager.GetInstance(typeof (IGateway)); + var manager = new Container(pluginGraph); + var gateway = (IGateway) manager.GetInstance(typeof (IGateway)); Assert.IsInstanceOfType(typeof (StubbedGateway), gateway); } @@ -146,14 +148,14 @@ [Test] public void CanOverrideTheDefaultInstanceAndCreateAnAllNewPluginOnTheFly() { - Registry registry = new Registry(); + var registry = new Registry(); registry.BuildInstancesOf<IGateway>().TheDefaultIsConcreteType<FakeGateway>(); PluginGraph pluginGraph = registry.Build(); Assert.IsTrue(pluginGraph.ContainsFamily(typeof (IGateway))); - Container manager = new Container(pluginGraph); - IGateway gateway = (IGateway) manager.GetInstance(typeof (IGateway)); + var manager = new Container(pluginGraph); + var gateway = (IGateway) manager.GetInstance(typeof (IGateway)); Assert.IsInstanceOfType(typeof (FakeGateway), gateway); } @@ -162,21 +164,22 @@ public void CreatePluginFamilyWithADefault() { IContainer manager = new Container(registry => registry.BuildInstancesOf<IWidget>().TheDefaultIs( - RegistryExpressions.Instance<ColorWidget>().WithProperty("color"). + RegistryExpressions.Instance<ColorWidget>().WithProperty( + "color"). EqualTo( "Red") )); - ColorWidget widget = (ColorWidget) manager.GetInstance<IWidget>(); + var widget = (ColorWidget) manager.GetInstance<IWidget>(); Assert.AreEqual("Red", widget.Color); } [Test] public void PutAnInterceptorIntoTheInterceptionChainOfAPluginFamilyInTheDSL() { - StubbedInstanceFactoryInterceptor factoryInterceptor = new StubbedInstanceFactoryInterceptor(); + var factoryInterceptor = new StubbedInstanceFactoryInterceptor(); - Registry registry = new Registry(); + var registry = new Registry(); registry.BuildInstancesOf<IGateway>().InterceptConstructionWith(factoryInterceptor); PluginGraph pluginGraph = registry.Build(); @@ -187,7 +190,7 @@ [Test] public void Set_the_default_by_a_lambda() { - Container manager = + var manager = new Container( registry => registry.ForRequestedType<IWidget>().TheDefault.Is.ConstructedBy(() => new AWidget())); @@ -197,15 +200,28 @@ [Test] public void Set_the_default_to_a_built_object() { - AWidget aWidget = new AWidget(); + var aWidget = new AWidget(); - Container manager = + var manager = new Container( registry => registry.ForRequestedType<IWidget>().TheDefault.Is.Object(aWidget)); Assert.AreSame(aWidget, manager.GetInstance<IWidget>()); } + [Test( + Description = + "Guid test based on problems encountered by Paul Segaro. See http://groups.google.com/group/structuremap-users/browse_thread/thread/34ddaf549ebb14f7?hl=en" + )] + public void TheDefaultInstanceIsALambdaForGuidNewGuid() + { + var manager = + new Container( + registry => registry.ForRequestedType<Guid>().TheDefault.Is.ConstructedBy(() => Guid.NewGuid())); + + Assert.IsInstanceOfType(typeof (Guid), manager.GetInstance<Guid>()); + } + [Test] public void TheDefaultInstanceIsConcreteType() { @@ -218,29 +234,19 @@ [Test] public void TheDefaultInstanceIsPickedUpFromTheAttribute() { - Registry registry = new Registry(); + var registry = new Registry(); registry.BuildInstancesOf<IGateway>(); - registry.ScanAssemblies().IncludeAssemblyContainingType<IGateway>(); + registry.Scan(x => x.AssemblyContainingType<IGateway>()); PluginGraph pluginGraph = registry.Build(); Assert.IsTrue(pluginGraph.ContainsFamily(typeof (IGateway))); - Container manager = new Container(pluginGraph); - IGateway gateway = (IGateway) manager.GetInstance(typeof (IGateway)); + var manager = new Container(pluginGraph); + var gateway = (IGateway) manager.GetInstance(typeof (IGateway)); Assert.IsInstanceOfType(typeof (DefaultGateway), gateway); } - - [Test(Description = "Guid test based on problems encountered by Paul Segaro. See http://groups.google.com/group/structuremap-users/browse_thread/thread/34ddaf549ebb14f7?hl=en")] - public void TheDefaultInstanceIsALambdaForGuidNewGuid() - { - Container manager = - new Container( - registry => registry.ForRequestedType<Guid>().TheDefault.Is.ConstructedBy(()=>Guid.NewGuid())); - - Assert.IsInstanceOfType(typeof(Guid), manager.GetInstance<Guid>()); - } } public class StubbedInstanceFactoryInterceptor : IBuildInterceptor Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryIntegratedTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryIntegratedTester.cs 2008-10-01 15:53:44 UTC (rev 159) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryIntegratedTester.cs 2008-10-01 18:29:38 UTC (rev 160) @@ -1,7 +1,6 @@ using System.Collections.Generic; using NUnit.Framework; using StructureMap.Graph; -using StructureMap.Pipeline; using StructureMap.Testing.Widget; using StructureMap.Testing.Widget5; @@ -28,10 +27,9 @@ [Test] public void AutomaticallyFindRegistryFromAssembly() { - StructureMapConfiguration.ResetAll(); - StructureMapConfiguration.ScanAssemblies().IncludeAssemblyContainingType<RedGreenRegistry>(); + ObjectFactory.Initialize(x => { x.Scan(s => { s.AssemblyContainingType<RedGreenRegistry>(); }); }); - List<string> colors = new List<string>(); + var colors = new List<string>(); foreach (IWidget widget in ObjectFactory.GetAllInstances<IWidget>()) { if (!(widget is ColorWidget)) @@ -39,7 +37,7 @@ continue; } - ColorWidget color = (ColorWidget) widget; + var color = (ColorWidget) widget; colors.Add(color.Color); } @@ -55,11 +53,15 @@ [Test] public void FindRegistriesWithinPluginGraphSeal() { - PluginGraph graph = new PluginGraph(); - graph.Assemblies.Add(typeof (RedGreenRegistry).Assembly); + var graph = new PluginGraph(); + + var scanner = new AssemblyScanner(); + scanner.AssemblyContainingType(typeof (RedGreenRegistry)); + scanner.ScanForAll(graph); + graph.Seal(); - List<string> colors = new List<string>(); + var colors = new List<string>(); PluginFamily family = graph.FindFamily(typeof (IWidget)); family.EachInstance(instance => colors.Add(instance.Name)); Deleted: trunk/Source/StructureMap.Testing/Configuration/DSL/ScanAssembliesTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/ScanAssembliesTester.cs 2008-10-01 15:53:44 UTC (rev 159) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/ScanAssembliesTester.cs 2008-10-01 18:29:38 UTC (rev 160) @@ -1,89 +0,0 @@ -using System.Reflection; -using NUnit.Framework; -using StructureMap.Configuration.DSL.Expressions; -using StructureMap.Graph; -using StructureMap.Testing.Widget3; - -namespace StructureMap.Testing.Configuration.DSL -{ - [TestFixture] - public class ScanAssembliesTester - { - #region Setup/Teardown - - [SetUp] - public void SetUp() - { - StructureMapConfiguration.ResetAll(); - } - - [TearDown] - public void TearDown() - { - StructureMapConfiguration.ResetAll(); - } - - #endregion - - [Test] - public void Combination1() - { - StructureMapConfiguration.ScanAssemblies() - .IncludeAssemblyContainingType<IGateway>() - .IncludeTheCallingAssembly(); - PluginGraph graph = StructureMapConfiguration.GetPluginGraph(); - - Assembly assembly = typeof (IGateway).Assembly; - Assert.IsTrue(graph.Assemblies.Contains(assembly.GetName().Name)); - - Assert.IsTrue(graph.Assemblies.Contains(Assembly.GetExecutingAssembly().GetName().Name)); - } - - - [Test] - public void Combination2() - { - StructureMapConfiguration.ScanAssemblies() - .IncludeTheCallingAssembly() - .IncludeAssemblyContainingType<IGateway>(); - PluginGraph graph = StructureMapConfiguration.GetPluginGraph(); - - Assembly assembly = typeof (IGateway).Assembly; - Assert.IsTrue(graph.Assemblies.Contains(assembly.GetName().Name)); - - Assert.IsTrue(graph.Assemblies.Contains(Assembly.GetExecutingAssembly().GetName().Name)); - } - - [Test] - public void ScanAssemblyByName() - { - ScanAssembliesExpression expression = StructureMapConfiguration.ScanAssemblies() - .IncludeAssembly(typeof (IGateway).Assembly.FullName); - Assert.IsNotNull(expression); - - PluginGraph graph = StructureMapConfiguration.GetPluginGraph(); - - Assembly assembly = typeof (IGateway).Assembly; - Assert.IsTrue(graph.Assemblies.Contains(assembly.GetName().Name)); - } - - [Test] - public void ScanAssemblyContainingType() - { - StructureMapConfiguration.ScanAssemblies().IncludeAssemblyContainingType<IGateway>(); - PluginGraph graph = StructureMapConfiguration.GetPluginGraph(); - - Assembly assembly = typeof (IGateway).Assembly; - Assert.IsTrue(graph.Assemblies.Contains(assembly.GetName().Name)); - } - - [Test] - public void ScanCallingAssembly() - { - StructureMapConfiguration.ScanAssemblies().IncludeTheCallingAssembly(); - PluginGraph graph = StructureMapConfiguration.GetPluginGraph(); - - Assert.IsTrue(graph.Assemblies.Contains(Assembly.GetExecutingAssembly().GetName().Name)); - } - } -} \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Configuration/IncludeTesting.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/IncludeTesting.cs 2008-10-01 15:53:44 UTC (rev 159) +++ trunk/Source/StructureMap.Testing/Configuration/IncludeTesting.cs 2008-10-01 18:29:38 UTC (rev 160) @@ -32,19 +32,6 @@ } [Test] - public void GetAssembliesFromIncludes() - { - PluginGraph graph = buildGraph(); - - Assert.AreEqual(4, graph.Assemblies.Count); - - Assert.IsTrue(graph.Assemblies.Contains("StructureMap.Testing.Widget")); - Assert.IsTrue(graph.Assemblies.Contains("StructureMap.Testing.Widget2")); - Assert.IsTrue(graph.Assemblies.Contains("StructureMap.Testing.Widget3")); - Assert.IsTrue(graph.Assemblies.Contains("StructureMap.Testing.Widget4")); - } - - [Test] public void GetFamilyFromIncludeAndMaster() { PluginGraph graph = buildGraph(); Modified: trunk/Source/StructureMap.Testing/Configuration/NormalGraphBuilderTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/NormalGraphBuilderTester.cs 2008-10-01 15:53:44 UTC (rev 159) +++ trunk/Source/StructureMap.Testing/Configuration/NormalGraphBuilderTester.cs 2008-10-01 18:29:38 UTC (rev 160) @@ -1,4 +1,3 @@ -using System; using NUnit.Framework; using StructureMap.Configuration; using StructureMap.Configuration.DSL; @@ -21,20 +20,9 @@ #endregion [Test] - public void AddAssembly_HappyPath() - { - GraphBuilder builder = new GraphBuilder(new Registry[0]); - string assemblyName = GetType().Assembly.GetName().Name; - builder.AddAssembly(assemblyName); - - Assert.IsTrue(builder.PluginGraph.Assemblies.Contains(assemblyName)); - Assert.AreEqual(0, builder.PluginGraph.Log.ErrorCount); - } - - [Test] public void AddAssembly_SadPath() { - GraphBuilder builder = new GraphBuilder(new Registry[0]); + var builder = new GraphBuilder(new Registry[0]); builder.AddAssembly("something"); builder.PluginGraph.Log.AssertHasError(101); @@ -43,10 +31,10 @@ [Test] public void Call_the_action_on_configure_family_if_the_pluginType_is_found() { - TypePath typePath = new TypePath(typeof (IGateway)); + var typePath = new TypePath(typeof (IGateway)); bool iWasCalled = false; - GraphBuilder builder = new GraphBuilder(new Registry[0]); + var builder = new GraphBuilder(new Registry[0]); builder.ConfigureFamily(typePath, f => { Assert.AreEqual(typeof (IGateway), f.PluginType); @@ -60,7 +48,7 @@ [Test] public void Configure_a_family_that_does_not_exist_and_log_an_error_with_PluginGraph() { - GraphBuilder builder = new GraphBuilder(new Registry[0]); + var builder = new GraphBuilder(new Registry[0]); builder.ConfigureFamily(new TypePath("a,a"), delegate { }); builder.PluginGraph.Log.AssertHasError(103); @@ -69,11 +57,11 @@ [Test] public void Create_system_object_successfully_and_call_the_requested_action() { - MemoryInstanceMemento memento = new MemoryInstanceMemento("Singleton", "anything"); + var memento = new MemoryInstanceMemento("Singleton", "anything"); bool iWasCalled = false; - GraphBuilder builder = new GraphBuilder(new Registry[0]); + var builder = new GraphBuilder(new Registry[0]); builder.PrepareSystemObjects(); builder.WithSystemObject<IBuildInterceptor>(memento, "singleton", policy => { @@ -87,15 +75,15 @@ [Test] public void Do_not_call_the_action_on_ConfigureFamily_if_the_type_path_blows_up() { - GraphBuilder builder = new GraphBuilder(new Registry[0]); + var builder = new GraphBuilder(new Registry[0]); builder.ConfigureFamily(new TypePath("a,a"), obj => Assert.Fail("Should not be called")); } [Test] public void Do_not_try_to_execute_the_action_when_requested_system_object_if_it_cannot_be_created() { - MemoryInstanceMemento memento = new MemoryInstanceMemento(); - GraphBuilder builder = new GraphBuilder(new Registry[0]); + var memento = new MemoryInstanceMemento(); + var builder = new GraphBuilder(new Registry[0]); builder.WithSystemObject<MementoSource>(memento, "I am going to break here", delegate { Assert.Fail("Wasn't supposed to be called"); }); @@ -104,8 +92,8 @@ [Test] public void Log_an_error_for_a_requested_system_object_if_it_cannot_be_created() { - MemoryInstanceMemento memento = new MemoryInstanceMemento(); - GraphBuilder builder = new GraphBuilder(new Registry[0]); + var memento = new MemoryInstanceMemento(); + var builder = new GraphBuilder(new Registry[0]); builder.WithSystemObject<MementoSource>(memento, "I am going to break here", delegate { }); @@ -115,7 +103,7 @@ [Test] public void WithType_calls_through_to_the_Action_if_the_type_can_be_found() { - GraphBuilder builder = new GraphBuilder(new Registry[0]); + var builder = new GraphBuilder(new Registry[0]); bool iWasCalled = true; builder.WithType(new TypePath(GetType()), "creating a Plugin", t => @@ -130,7 +118,7 @@ [Test] public void WithType_fails_and_logs_error_with_the_context() { - GraphBuilder builder = new GraphBuilder(new Registry[0]); + var builder = new GraphBuilder(new Registry[0]); builder.WithType(new TypePath("a,a"), "creating a Plugin", obj => Assert.Fail("Should not be called")); builder.PluginGraph.Log.AssertHasError(131); Modified: trunk/Source/StructureMap.Testing/DataAccess/Debugging.cs =================================================================== --- trunk/Source/StructureMap.Testing/DataAccess/Debugging.cs 2008-10-01 15:53:44 UTC (rev 159) +++ trunk/Source/StructureMap.Testing/DataAccess/Debugging.cs 2008-10-01 18:29:38 UTC (rev 160) @@ -11,6 +11,7 @@ [TestFixture] public class Debugging { + [Test, Explicit] public void GiveJSONAWhirl() { Modified: trunk/Source/StructureMap.Testing/GenericsAcceptanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/GenericsAcceptanceTester.cs 2008-10-01 15:53:44 UTC (rev 159) +++ trunk/Source/StructureMap.Testing/GenericsAcceptanceTester.cs 2008-10-01 18:29:38 UTC (rev 160) @@ -1,7 +1,6 @@ using System; using System.Reflection; using NUnit.Framework; -using StructureMap.Configuration.DSL; using StructureMap.Graph; using StructureMap.Pipeline; using StructureMap.Testing.GenericWidgets; @@ -20,20 +19,20 @@ #endregion - - [Test] public void BuildFamilyAndPluginThenSealAndCreateInstanceManagerWithGenericTypeWithOpenGenericParameters() { - PluginGraph graph = new PluginGraph(); - graph.Assemblies.Add(Assembly.GetExecutingAssembly()); + var graph = new PluginGraph(); + graph.Scan(x => x.TheCallingAssembly()); + + PluginFamily family = graph.FindFamily(typeof (IGenericService<>)); family.DefaultInstanceKey = "Default"; family.AddPlugin(typeof (GenericService<>), "Default"); graph.Seal(); - Container manager = new Container(graph); + var manager = new Container(graph); } [Test] @@ -41,11 +40,11 @@ { Type serviceType = typeof (IService<double>); PluginGraph pluginGraph = PluginGraph.BuildGraphFromAssembly(serviceType.Assembly); - Container manager = new Container(pluginGraph); + var manager = new Container(pluginGraph); Type doubleServiceType = typeof (IService<double>); - ServiceWithPlug<double> service = + var service = (ServiceWithPlug<double>) manager.GetInstance(doubleServiceType, "Plugged"); Assert.AreEqual(typeof (double), service.Plug.PlugType); } @@ -53,53 +52,53 @@ [Test] public void CanCreatePluginFamilyForGenericTypeWithGenericParameter() { - PluginFamily family = new PluginFamily(typeof (IGenericService<int>)); + var family = new PluginFamily(typeof (IGenericService<int>)); } [Test] public void CanCreatePluginFamilyForGenericTypeWithoutGenericParameter() { - PluginFamily family = new PluginFamily(typeof (IGenericService<>)); + var family = new PluginFamily(typeof (IGenericService<>)); } [Test] public void CanCreatePluginForGenericTypeWithGenericParameter() { - Plugin plugin = new Plugin(typeof (GenericService<int>)); + var plugin = new Plugin(typeof (GenericService<int>)); } [Test] public void CanCreatePluginForGenericTypeWithoutGenericParameter() { - Plugin plugin = new Plugin(typeof (GenericService<>)); + var plugin = new Plugin(typeof (GenericService<>)); } [Test] public void CanEmitForATemplateWithTwoTemplates() { - PluginFamily family = new PluginFamily(typeof (ITarget<int, string>)); + var family = new PluginFamily(typeof (ITarget<int, string>)); family.AddPlugin(typeof (SpecificTarget<int, string>), "specific"); - InstanceFactory factory = new InstanceFactory(family); + var factory = new InstanceFactory(family); } [Test] public void CanEmitInstanceBuilderForATypeWithConstructorArguments() { - PluginGraph graph = new PluginGraph(); + var graph = new PluginGraph(); PluginFamily family = graph.FindFamily(typeof (ComplexType<int>)); family.AddPlugin(typeof (ComplexType<int>), "complex"); - Container manager = new Container(graph); + var manager = new Container(graph); - ConfiguredInstance instance = new ConfiguredInstance(typeof(ComplexType<int>)) + ConfiguredInstance instance = new ConfiguredInstance(typeof (ComplexType<int>)) .WithProperty("name").EqualTo("Jeremy") .WithProperty("age").EqualTo(32); - ComplexType<int> com = manager.GetInstance<ComplexType<int>>(instance); + var com = manager.GetInstance<ComplexType<int>>(instance); Assert.AreEqual("Jeremy", com.Name); Assert.AreEqual(32, com.Age); } @@ -107,8 +106,9 @@ [Test] public void CanGetPluginFamilyFromPluginGraphWithNoParameters() { - PluginGraph graph = new PluginGraph(); - graph.Assemblies.Add(Assembly.GetExecutingAssembly()); + var graph = new PluginGraph(); + graph.Scan(x => x.TheCallingAssembly()); + PluginFamily family1 = graph.FindFamily(typeof (IGenericService<int>)); PluginFamily family2 = graph.FindFamily(typeof (IGenericService<string>)); PluginFamily family3 = graph.FindFamily(typeof (IGenericService<>)); @@ -121,8 +121,9 @@ [Test] public void CanGetPluginFamilyFromPluginGraphWithParameters() { - PluginGraph graph = new PluginGraph(); - graph.Assemblies.Add(Assembly.GetExecutingAssembly()); + var graph = new PluginGraph(); + graph.Scan(x => x.TheCallingAssembly()); + PluginFamily family1 = graph.FindFamily(typeof (IGenericService<int>)); PluginFamily family2 = graph.FindFamily(typeof (IGenericService<string>)); @@ -185,9 +186,9 @@ pluginGraph.SetDefault("2", typeof (IService<>), new ReferencedInstance("Plugged")); - Container manager = new Container(pluginGraph); + var manager = new Container(pluginGraph); - IPlug<string> plug = manager.GetInstance<IPlug<string>>(); + var plug = manager.GetInstance<IPlug<string>>(); manager.SetDefaultsToProfile("1"); Assert.IsInstanceOfType(typeof (Service<string>), manager.GetInstance(typeof (IService<string>))); Modified: trunk/Source/StructureMap.Testing/Graph/ArrayConstructorTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/ArrayConstructorTester.cs 2008-10-01 15:53:44 UTC (rev 159) +++ trunk/Source/StructureMap.Testing/Graph/ArrayConstructorTester.cs 2008-10-01 18:29:38 UTC (rev 160) @@ -8,16 +8,7 @@ [TestFixture] public class ArrayConstructorTester { - #region Setup/Teardown - [TearDown] - public void TearDown() - { - ObjectMother.Reset(); - } - - #endregion - [Test] public void BuildDecisionWithRules() { Modified: trunk/Source/StructureMap.Testing/Graph/ContainerTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/ContainerTester.cs 2008-10-01 15:53:44 UTC (rev 159) +++ trunk/Source/StructureMap.Testing/Graph/ContainerTester.cs 2008-10-01 18:29:38 UTC (rev 160) @@ -20,7 +20,7 @@ { _manager = new Container(registry => { - registry.ScanAssemblies().IncludeAssembly("StructureMap.Testing.Widget"); + registry.Scan(x => x.Assembly("StructureMap.Testing.Widget")); registry.BuildInstancesOf<Rule>(); registry.BuildInstancesOf<IWidget>(); registry.BuildInstancesOf<WidgetMaker>(); @@ -36,8 +36,10 @@ _manager.Configure(r => { r.InstanceOf<Rule>().Is.OfConcreteType<ColorRule>().WithCtorArg("color").EqualTo(Color).WithName(Color); - r.InstanceOf<IWidget>().Is.OfConcreteType<ColorWidget>().WithCtorArg("color").EqualTo(Color).WithName(Color); - r.InstanceOf<WidgetMaker>().Is.OfConcreteType<ColorWidgetMaker>().WithCtorArg("color").EqualTo(Color).WithName(Color); + r.InstanceOf<IWidget>().Is.OfConcreteType<ColorWidget>().WithCtorArg("color").EqualTo(Color).WithName( + Color); + r.InstanceOf<WidgetMaker>().Is.OfConcreteType<ColorWidgetMaker>().WithCtorArg("color").EqualTo(Color). + WithName(Color); }); } @@ -71,7 +73,7 @@ private void assertColorIs(IContainer manager, string color) { - ColorService rule = (ColorService) manager.GetInstance<IService>(); + var rule = (ColorService) manager.GetInstance<IService>(); Assert.AreEqual(color, rule.Color); } @@ -111,7 +113,7 @@ // Now, have that same Container create a ClassThatUsesProvider. StructureMap will // see that ClassThatUsesProvider is concrete, determine its constructor args, and build one // for you with the default IProvider. No other configuration necessary. - ClassThatUsesProvider classThatUsesProvider = manager.GetInstance<ClassThatUsesProvider>(); + var classThatUsesProvider = manager.GetInstance<ClassThatUsesProvider>(); Assert.IsInstanceOfType(typeof (Provider), classThatUsesProvider.Provider); } @@ -122,18 +124,18 @@ new Container( registry => registry.ForRequestedType<IProvider>().TheDefaultIsConcreteType<Provider>()); - DifferentProvider differentProvider = new DifferentProvider(); - ExplicitArguments args = new ExplicitArguments(); + var differentProvider = new DifferentProvider(); + var args = new ExplicitArguments(); args.Set<IProvider>(differentProvider); - ClassThatUsesProvider classThatUsesProvider = manager.GetInstance<ClassThatUsesProvider>(args); + var classThatUsesProvider = manager.GetInstance<ClassThatUsesProvider>(args); Assert.AreSame(differentProvider, classThatUsesProvider.Provider); } [Test, ExpectedException(typeof (StructureMapConfigurationException))] public void CTOR_throws_StructureMapConfigurationException_if_there_is_an_error() { - PluginGraph graph = new PluginGraph(); + var graph = new PluginGraph(); graph.Log.RegisterError(400, new ApplicationException("Bad!")); new Container(graph); @@ -145,12 +147,12 @@ { Type serviceType = typeof (IService<string>); PluginGraph pluginGraph = PluginGraph.BuildGraphFromAssembly(serviceType.Assembly); - PipelineGraph pipelineGraph = new PipelineGraph(pluginGraph); + var pipelineGraph = new PipelineGraph(pluginGraph); Type stringService = typeof (IService<string>); IInstanceFactory factory = pipelineGraph.ForType(stringService); - Assert.AreEqual(stringService, factory.PluginType); + Assert.AreEqual((object) stringService, factory.PluginType); } [Test] @@ -161,7 +163,7 @@ addColorMemento("Blue"); _manager.SetDefault(typeof (Rule), "Blue"); - ColorRule rule = _manager.GetInstance(typeof (Rule)) as ColorRule; + var rule = _manager.GetInstance(typeof (Rule)) as ColorRule; Assert.IsNotNull(rule); Assert.AreEqual("Blue", rule.Color); @@ -174,15 +176,15 @@ addColorMemento("Orange"); addColorMemento("Blue"); - ColorRule rule = _manager.GetInstance(typeof (Rule), "Blue") as ColorRule; + var rule = _manager.GetInstance(typeof (Rule), "Blue") as ColorRule; Assert.IsNotNull(rule); Assert.AreEqual("Blue", rule.Color); - ColorWidget widget = _manager.GetInstance(typeof (IWidget), "Red") as ColorWidget; + var widget = _manager.GetInstance(typeof (IWidget), "Red") as ColorWidget; Assert.IsNotNull(widget); Assert.AreEqual("Red", widget.Color); - ColorWidgetMaker maker = _manager.GetInstance(typeof (WidgetMaker), "Orange") as ColorWidgetMaker; + var maker = _manager.GetInstance(typeof (WidgetMaker), "Orange") as ColorWidgetMaker; Assert.IsNotNull(maker); Assert.AreEqual("Orange", maker.Color); } @@ -198,8 +200,8 @@ { IContainer container = new Container(); - ColorRule red = new ColorRule("Red"); - ColorRule blue = new ColorRule("Blue"); + var red = new ColorRule("Red"); + var blue = new ColorRule("Blue"); container.Inject<Rule>("Red", red); container.Inject<Rule>("Blue", blue); @@ -236,12 +238,8 @@ [Test, ExpectedException(typeof (StructureMapException))] public void TryToGetDefaultInstanceWithNoInstance() { - Container manager = new Container(new PluginGraph()); + var manager = new Container(new PluginGraph()); manager.GetInstance<IService>(); } - - } - - } \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Graph/DefaultConventionScanningTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/DefaultConventionScanningTester.cs 2008-10-01 15:53:44 UTC (rev 159) +++ trunk/Source/StructureMap.Testing/Graph/DefaultConventionScanningTester.cs 2008-10-01 18:29:38 UTC (rev 160) @@ -38,8 +38,14 @@ [Test] public void Process_to_Container() { - Container container = new Container(registry => registry.ScanAssemblies().IncludeTheCallingAssembly() - .With(new DefaultConventionScanner())); + Container container = new Container(registry => + { + registry.Scan(x => + { + x.TheCallingAssembly(); + x.With<DefaultConventionScanner>(); + }); + }); Debug.WriteLine(container.WhatDoIHave()); @@ -50,8 +56,14 @@ [Test] public void Process_to_Container_2() { - Container container = new Container(registry => registry.ScanAssemblies().IncludeTheCallingAssembly() - .With<DefaultConventionScanner>()); + Container container = new Container(registry => + { + registry.Scan(x => + { + x.TheCallingAssembly(); + x.With(new DefaultConventionScanner()); + }); + }); Assert.IsInstanceOfType... [truncated message content] |
From: <jer...@us...> - 2008-10-02 18:44:12
|
Revision: 162 http://structuremap.svn.sourceforge.net/structuremap/?rev=162&view=rev Author: jeremydmiller Date: 2008-10-02 18:44:00 +0000 (Thu, 02 Oct 2008) Log Message: ----------- assembly scanning updates Modified Paths: -------------- trunk/Source/StructureMap/Configuration/DSL/Registry.cs trunk/Source/StructureMap/Configuration/GraphBuilder.cs trunk/Source/StructureMap/Diagnostics/ValidationBuildSession.cs trunk/Source/StructureMap/Graph/AssemblyScanner.cs trunk/Source/StructureMap/Graph/PluginFamily.cs trunk/Source/StructureMap/Graph/PluginGraph.cs trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryTester.cs trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj Added Paths: ----------- trunk/Source/StructureMap.Testing/Graph/AssemblyScannerTester.cs Modified: trunk/Source/StructureMap/Configuration/DSL/Registry.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2008-10-02 01:05:46 UTC (rev 161) +++ trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2008-10-02 18:44:00 UTC (rev 162) @@ -9,6 +9,7 @@ { public class Registry : RegistryExpressions { + private readonly List<Action> _basicActions = new List<Action>(); private readonly List<Action<PluginGraph>> _actions = new List<Action<PluginGraph>>(); public Registry() @@ -24,6 +25,11 @@ // no-op; } + protected void registerAction(Action action) + { + _basicActions.Add(action); + } + internal void addExpression(Action<PluginGraph> alteration) { _actions.Add(alteration); @@ -35,10 +41,8 @@ graph.Log.StartSource("Registry: " + TypePath.GetAssemblyQualifiedName(GetType())); - foreach (Action<PluginGraph> action in _actions) - { - action(graph); - } + _basicActions.ForEach(action => action()); + _actions.ForEach(action => action(graph)); graph.Registries.Add(this); } Modified: trunk/Source/StructureMap/Configuration/GraphBuilder.cs =================================================================== --- trunk/Source/StructureMap/Configuration/GraphBuilder.cs 2008-10-02 01:05:46 UTC (rev 161) +++ trunk/Source/StructureMap/Configuration/GraphBuilder.cs 2008-10-02 18:44:00 UTC (rev 162) @@ -33,7 +33,6 @@ _systemScanner = new AssemblyScanner(); _systemScanner.Assembly(Assembly.GetExecutingAssembly()); - _systemScanner.IgnoreRegistries(); _systemGraph = new PluginGraph(_systemScanner); } Modified: trunk/Source/StructureMap/Diagnostics/ValidationBuildSession.cs =================================================================== --- trunk/Source/StructureMap/Diagnostics/ValidationBuildSession.cs 2008-10-02 01:05:46 UTC (rev 161) +++ trunk/Source/StructureMap/Diagnostics/ValidationBuildSession.cs 2008-10-02 18:44:00 UTC (rev 162) @@ -147,6 +147,12 @@ _validationErrors.ForEach(e => e.Write(writer)); _errors.ForEach(e => e.Write(writer)); + writer.WriteLine(); + writer.WriteLine(); + + + writer.WriteLine("StructureMap Failures: {0} Build/Configuration Failures and {1} Validation Errors", _errors.BuildErrors.Length, _validationErrors.Count); + return builder.ToString(); } Modified: trunk/Source/StructureMap/Graph/AssemblyScanner.cs =================================================================== --- trunk/Source/StructureMap/Graph/AssemblyScanner.cs 2008-10-02 01:05:46 UTC (rev 161) +++ trunk/Source/StructureMap/Graph/AssemblyScanner.cs 2008-10-02 18:44:00 UTC (rev 162) @@ -8,16 +8,25 @@ namespace StructureMap.Graph { + public static class TypeExtensions + { + public static bool IsInNamespace(this Type type, string nameSpace) + { + return type.Namespace.StartsWith(nameSpace); + } + } + public class AssemblyScanner { private readonly List<Assembly> _assemblies = new List<Assembly>(); private readonly List<ITypeScanner> _scanners = new List<ITypeScanner>(); + private readonly List<Predicate<Type>> _includes = new List<Predicate<Type>>(); + private readonly List<Predicate<Type>> _excludes = new List<Predicate<Type>>(); public AssemblyScanner() { With<FamilyAttributeScanner>(); With<PluggableAttributeScanner>(); - With<FindRegistriesScanner>(); } public int Count @@ -25,6 +34,8 @@ get { return _assemblies.Count; } } + + public void ScanForAll(PluginGraph pluginGraph) { _assemblies.ForEach(assem => scanTypesInAssembly(assem, pluginGraph)); @@ -37,6 +48,9 @@ { foreach (Type type in assembly.GetExportedTypes()) { + if (!isInTheIncludes(type)) continue; + if (isInTheExcludes(type)) continue; + _scanners.ForEach(scanner => scanner.Process(type, graph)); } } @@ -46,6 +60,31 @@ } } + private bool isInTheExcludes(Type type) + { + if (_excludes.Count == 0) return false; + + foreach (var exclude in _excludes) + { + if (exclude(type)) return true; + } + + return false; + } + + private bool isInTheIncludes(Type type) + { + if (_includes.Count == 0) return true; + + + foreach (var include in _includes) + { + if (include(type)) return true; + } + + return false; + } + public void Assembly(Assembly assembly) { if (!_assemblies.Contains(assembly)) @@ -79,8 +118,15 @@ _scanners.Add(scanner); } + public void WithDefaultConventions() + { + With<DefaultConventionScanner>(); + } + public void With<T>() where T : ITypeScanner, new() { + _scanners.RemoveAll(scanner => scanner is T); + ITypeScanner previous = _scanners.FirstOrDefault(scanner => scanner is T); if (previous == null) { @@ -88,9 +134,9 @@ } } - public void IgnoreRegistries() + public void LookForRegistries() { - _scanners.RemoveAll(x => x is FindRegistriesScanner); + With<FindRegistriesScanner>(); } public void TheCallingAssembly() @@ -142,5 +188,46 @@ With(new FindAllTypesFilter(pluginType)); } + public void IgnoreStructureMapAttributes() + { + _scanners.RemoveAll(scanner => scanner is FamilyAttributeScanner); + _scanners.RemoveAll(scanner => scanner is PluggableAttributeScanner); + } + + + public void Exclude(Predicate<Type> exclude) + { + _excludes.Add(exclude); + } + + public void ExcludeNamespace(string nameSpace) + { + Exclude(type => type.IsInNamespace(nameSpace)); + } + + public void ExcludeNamespaceContainingType<T>() + { + ExcludeNamespace(typeof(T).Namespace); + } + + public void Include(Predicate<Type> predicate) + { + _includes.Add(predicate); + } + + public void IncludeNamespace(string nameSpace) + { + Include(type => type.IsInNamespace(nameSpace)); + } + + public void IncludeNamespaceContainingType<T>() + { + IncludeNamespace(typeof (T).Namespace); + } + + public void ExcludeType<T>() + { + Exclude(type => type == typeof (T)); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Graph/PluginFamily.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginFamily.cs 2008-10-02 01:05:46 UTC (rev 161) +++ trunk/Source/StructureMap/Graph/PluginFamily.cs 2008-10-02 18:44:00 UTC (rev 162) @@ -346,5 +346,15 @@ AddPlugin(concreteType); } } + + public void AddType(Type concreteType, string name) + { + if (!CanBeCast(_pluginType, concreteType)) return; + + if (FindPlugin(name) == null) + { + AddPlugin(concreteType, name); + } + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Graph/PluginGraph.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginGraph.cs 2008-10-02 01:05:46 UTC (rev 161) +++ trunk/Source/StructureMap/Graph/PluginGraph.cs 2008-10-02 18:44:00 UTC (rev 162) @@ -156,9 +156,22 @@ FindFamily(pluginType).AddType(concreteType); } + public void AddType(Type pluginType, Type concreteType, string name) + { + FindFamily(pluginType).AddType(concreteType, name); + } + public void AddType(Type pluggedType) { _pluggedTypes.Add(pluggedType); } + + public void Configure(Action<Registry> action) + { + var registry = new Registry(); + action(registry); + + registry.ConfigurePluginGraph(this); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryTester.cs 2008-10-02 01:05:46 UTC (rev 161) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryTester.cs 2008-10-02 18:44:00 UTC (rev 162) @@ -18,6 +18,8 @@ #endregion + + [Test] public void Equals_check_true() { @@ -59,6 +61,13 @@ Container container = new Container(registry); } + + [Test] + public void use_the_basic_actions_as_part_of_building_a_PluginGraph() + { + var container = new Container(new BasicActionRegistry()); + container.GetInstance<IGateway>().ShouldBeOfType<Fake3Gateway>(); + } } public class ConcreteWithNoConstructor @@ -142,4 +151,12 @@ #endregion } + + public class BasicActionRegistry : Registry + { + public BasicActionRegistry() + { + registerAction(() => ForRequestedType<IGateway>().TheDefaultIsConcreteType<Fake3Gateway>()); + } + } } \ No newline at end of file Added: trunk/Source/StructureMap.Testing/Graph/AssemblyScannerTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/AssemblyScannerTester.cs (rev 0) +++ trunk/Source/StructureMap.Testing/Graph/AssemblyScannerTester.cs 2008-10-02 18:44:00 UTC (rev 162) @@ -0,0 +1,299 @@ +using System; +using NUnit.Framework; +using StructureMap.Configuration.DSL; +using StructureMap.Graph; +using StructureMap.Testing.Widget; +using StructureMap.Testing.Widget5; + +namespace StructureMap.Testing.Graph +{ + public class TestingRegistry : Registry + { + public static bool WasUsed; + + public TestingRegistry() + { + WasUsed = true; + + ForRequestedType<Rule>().TheDefault.IsThis(new ColorRule("Green")); + } + + public static void Reset() + { + WasUsed = false; + } + } + + [TestFixture] + public class AssemblyScannerTester + { + #region Setup/Teardown + + [SetUp] + public void SetUp() + { + TestingRegistry.Reset(); + + theGraph = null; + } + + #endregion + + private PluginGraph theGraph; + + private void Scan(Action<AssemblyScanner> action) + { + var scanner = new AssemblyScanner(); + action(scanner); + theGraph = new PluginGraph(); + scanner.ScanForAll(theGraph); + } + + + private void shouldHaveFamily<T>() + { + theGraph.PluginFamilies.Contains(typeof (T)).ShouldBeTrue(); + } + + private void shouldNotHaveFamily<T>() + { + theGraph.PluginFamilies.Contains(typeof (T)).ShouldBeFalse(); + } + + [Test] + public void AssemblyScanner_will_scan_for_attributes_by_default() + { + Scan(x => { x.AssemblyContainingType<ITypeThatHasAttributeButIsNotInRegistry>(); }); + + shouldHaveFamily<ITypeThatHasAttributeButIsNotInRegistry>(); + } + + [Test] + public void is_in_namespace() + { + GetType().IsInNamespace("blah").ShouldBeFalse(); + GetType().IsInNamespace("StructureMap").ShouldBeTrue(); + GetType().IsInNamespace("StructureMap.Testing").ShouldBeTrue(); + GetType().IsInNamespace("StructureMap.Testing.Graph").ShouldBeTrue(); + GetType().IsInNamespace("StructureMap.Testing.Graph.Something").ShouldBeFalse(); + } + + [Test] + public void Only_scan_for_registries_ignores_attributes() + { + Scan(x => + { + x.AssemblyContainingType<ITypeThatHasAttributeButIsNotInRegistry>(); + x.IgnoreStructureMapAttributes(); + }); + + shouldNotHaveFamily<ITypeThatHasAttributeButIsNotInRegistry>(); + } + + [Test] + public void scan_but_ignore_registries_by_default() + { + Scan(x => + { + x.TheCallingAssembly(); + }); + + TestingRegistry.WasUsed.ShouldBeFalse(); + } + + [Test] + public void Search_for_registries_by_default() + { + Scan(x => + { + x.TheCallingAssembly(); + x.LookForRegistries(); + }); + + TestingRegistry.WasUsed.ShouldBeTrue(); + } + + [Test] + public void test_the_family_attribute_scanner() + { + var scanner = new FamilyAttributeScanner(); + var graph = new PluginGraph(); + + scanner.Process(typeof (ITypeThatHasAttributeButIsNotInRegistry), graph); + graph.PluginFamilies.Contains(typeof (ITypeThatHasAttributeButIsNotInRegistry)).ShouldBeTrue(); + + scanner.Process(GetType(), graph); + graph.PluginFamilies.Contains(GetType()).ShouldBeFalse(); + } + + [Test] + public void use_a_dual_exclude() + { + Scan(x => + { + x.AssemblyContainingType<ITypeThatHasAttributeButIsNotInRegistry>(); + x.Exclude(type => type == typeof (ITypeThatHasAttributeButIsNotInRegistry)); + x.Exclude(type => type == typeof (IInterfaceInWidget5)); + }); + + shouldNotHaveFamily<IInterfaceInWidget5>(); + shouldNotHaveFamily<ITypeThatHasAttributeButIsNotInRegistry>(); + } + + + [Test] + public void use_a_dual_exclude2() + { + Scan(x => + { + x.AssemblyContainingType<ITypeThatHasAttributeButIsNotInRegistry>(); + x.Exclude(type => type == typeof (ITypeThatHasAttributeButIsNotInRegistry)); + x.Exclude(type => type == GetType()); + }); + + shouldHaveFamily<IInterfaceInWidget5>(); + shouldNotHaveFamily<ITypeThatHasAttributeButIsNotInRegistry>(); + } + + [Test] + public void use_a_single_exclude() + { + Scan(x => + { + x.AssemblyContainingType<ITypeThatHasAttributeButIsNotInRegistry>(); + x.Exclude(type => type == typeof (ITypeThatHasAttributeButIsNotInRegistry)); + }); + + shouldHaveFamily<IInterfaceInWidget5>(); + shouldNotHaveFamily<ITypeThatHasAttributeButIsNotInRegistry>(); + } + + + [Test] + public void use_a_single_exclude2() + { + Scan(x => + { + x.AssemblyContainingType<ITypeThatHasAttributeButIsNotInRegistry>(); + x.ExcludeNamespace("StructureMap.Testing.Widget5"); + }); + + shouldNotHaveFamily<IInterfaceInWidget5>(); + shouldNotHaveFamily<ITypeThatHasAttributeButIsNotInRegistry>(); + } + + + [Test] + public void use_a_single_exclude3() + { + Scan(x => + { + x.AssemblyContainingType<ITypeThatHasAttributeButIsNotInRegistry>(); + x.ExcludeNamespaceContainingType<ITypeThatHasAttributeButIsNotInRegistry>(); + }); + + shouldNotHaveFamily<IInterfaceInWidget5>(); + shouldNotHaveFamily<ITypeThatHasAttributeButIsNotInRegistry>(); + } + + + [Test] + public void use_a_single_exclude_of_type() + { + Scan(x => + { + x.AssemblyContainingType<ITypeThatHasAttributeButIsNotInRegistry>(); + x.ExcludeType<ITypeThatHasAttributeButIsNotInRegistry>(); + }); + + shouldHaveFamily<IInterfaceInWidget5>(); + shouldNotHaveFamily<ITypeThatHasAttributeButIsNotInRegistry>(); + } + + [Test] + public void Use_a_single_include_predicate() + { + Scan(x => { x.AssemblyContainingType<ITypeThatHasAttributeButIsNotInRegistry>(); }); + + shouldHaveFamily<IInterfaceInWidget5>(); + shouldHaveFamily<ITypeThatHasAttributeButIsNotInRegistry>(); + + Scan(x => + { + x.AssemblyContainingType<ITypeThatHasAttributeButIsNotInRegistry>(); + x.Include(type => type == typeof (ITypeThatHasAttributeButIsNotInRegistry)); + }); + + shouldNotHaveFamily<IInterfaceInWidget5>(); + shouldHaveFamily<ITypeThatHasAttributeButIsNotInRegistry>(); + } + + + [Test] + public void Use_a_single_include_predicate_2() + { + Scan(x => { x.AssemblyContainingType<ITypeThatHasAttributeButIsNotInRegistry>(); }); + + shouldHaveFamily<IInterfaceInWidget5>(); + shouldHaveFamily<ITypeThatHasAttributeButIsNotInRegistry>(); + + Scan(x => + { + x.AssemblyContainingType<ITypeThatHasAttributeButIsNotInRegistry>(); + x.IncludeNamespace(typeof (ITypeThatHasAttributeButIsNotInRegistry).Namespace); + }); + + shouldHaveFamily<IInterfaceInWidget5>(); + shouldHaveFamily<ITypeThatHasAttributeButIsNotInRegistry>(); + } + + + [Test] + public void Use_a_single_include_predicate_3() + { + Scan(x => { x.AssemblyContainingType<ITypeThatHasAttributeButIsNotInRegistry>(); }); + + shouldHaveFamily<IInterfaceInWidget5>(); + shouldHaveFamily<ITypeThatHasAttributeButIsNotInRegistry>(); + + Scan(x => + { + x.AssemblyContainingType<ITypeThatHasAttributeButIsNotInRegistry>(); + x.IncludeNamespaceContainingType<ITypeThatHasAttributeButIsNotInRegistry>(); + }); + + shouldHaveFamily<IInterfaceInWidget5>(); + shouldHaveFamily<ITypeThatHasAttributeButIsNotInRegistry>(); + } + + + [Test] + public void use_two_predicates_for_includes() + { + Scan(x => + { + x.AssemblyContainingType<ITypeThatHasAttributeButIsNotInRegistry>(); + x.Include(type => type == typeof (ITypeThatHasAttributeButIsNotInRegistry)); + x.Include(type => type == typeof (IInterfaceInWidget5)); + }); + + shouldHaveFamily<IInterfaceInWidget5>(); + shouldHaveFamily<ITypeThatHasAttributeButIsNotInRegistry>(); + } + + + [Test] + public void use_two_predicates_for_includes2() + { + Scan(x => + { + x.AssemblyContainingType<ITypeThatHasAttributeButIsNotInRegistry>(); + x.Include(type => type == typeof (ITypeThatHasAttributeButIsNotInRegistry)); + x.Include(type => type == GetType()); + }); + + shouldNotHaveFamily<IInterfaceInWidget5>(); + shouldHaveFamily<ITypeThatHasAttributeButIsNotInRegistry>(); + } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs 2008-10-02 01:05:46 UTC (rev 161) +++ trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs 2008-10-02 18:44:00 UTC (rev 162) @@ -73,6 +73,17 @@ } [Test] + public void add_type_by_name() + { + var family = new PluginFamily(typeof(IServiceProvider)); + family.AddType(typeof(DataTable), "table"); + + family.PluginCount.ShouldEqual(1); + + family.FindPlugin("table").ShouldNotBeNull(); + } + + [Test] public void AddAPluggedType() { var family = new PluginFamily(typeof (IWidget)); Modified: trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj =================================================================== --- trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2008-10-02 01:05:46 UTC (rev 161) +++ trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2008-10-02 18:44:00 UTC (rev 162) @@ -215,6 +215,7 @@ <Compile Include="Graph\ArrayConstructorTester.cs"> <SubType>Code</SubType> </Compile> + <Compile Include="Graph\AssemblyScannerTester.cs" /> <Compile Include="Graph\ContainerConstructorAttributeTester.cs"> <SubType>Code</SubType> </Compile> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |