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