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