From: <jer...@us...> - 2008-10-03 14:48:09
|
Revision: 163 http://structuremap.svn.sourceforge.net/structuremap/?rev=163&view=rev Author: jeremydmiller Date: 2008-10-03 14:47:59 +0000 (Fri, 03 Oct 2008) Log Message: ----------- doing some work for querying the state of the container Modified Paths: -------------- trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs trunk/Source/StructureMap/Graph/PluginFamily.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/ConfiguredInstance.cs trunk/Source/StructureMap/Pipeline/Instance.cs trunk/Source/StructureMap/Pipeline/Profile.cs trunk/Source/StructureMap/Pipeline/ProfileManager.cs trunk/Source/StructureMap/PipelineGraph.cs trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryIntegratedTester.cs trunk/Source/StructureMap.Testing/Graph/GenericsPluginGraphTester.cs trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs trunk/Source/StructureMap.Testing/PipelineGraphTester.cs Modified: trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs =================================================================== --- trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs 2008-10-02 18:44:00 UTC (rev 162) +++ trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs 2008-10-03 14:47:59 UTC (rev 163) @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using StructureMap.Pipeline; using StructureMap.Util; @@ -19,6 +20,17 @@ get { return _families.Count; } } + public IEnumerable<PluginTypeConfiguration> Families + { + get + { + foreach (var family in _families) + { + yield return family.GetConfiguration(); + } + } + } + public static bool CanBeCast(Type pluginType, Type pluggedType) { try @@ -101,9 +113,6 @@ { PluginFamily templatedFamily = baseFamily.CreateTemplatedClone(templateTypes); - - - return templatedFamily; } @@ -155,5 +164,10 @@ { return _families.Retrieve(pluginType); } + + public bool HasFamily(Type pluginType) + { + return _families.Has(pluginType); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Graph/PluginFamily.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginFamily.cs 2008-10-02 18:44:00 UTC (rev 162) +++ trunk/Source/StructureMap/Graph/PluginFamily.cs 2008-10-03 14:47:59 UTC (rev 163) @@ -257,6 +257,11 @@ get { return _instances.Count; } } + public IEnumerable<IInstance> Instances + { + get { return _instances.GetAll(); } + } + #endregion public Plugin FindPlugin(Type pluggedType) @@ -356,5 +361,16 @@ AddPlugin(concreteType, name); } } + + public PluginTypeConfiguration GetConfiguration() + { + return new PluginTypeConfiguration() + { + Instance = GetDefaultInstance(), + PluginType = PluginType, + Policy = _buildPolicy, + Instances = Instances + }; + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/IContainer.cs =================================================================== --- trunk/Source/StructureMap/IContainer.cs 2008-10-02 18:44:00 UTC (rev 162) +++ trunk/Source/StructureMap/IContainer.cs 2008-10-03 14:47:59 UTC (rev 163) @@ -34,9 +34,6 @@ string WhatDoIHave(); - - - /// <summary> /// Creates a new object instance of the requested type /// </summary> @@ -70,5 +67,6 @@ void AssertConfigurationIsValid(); object GetInstance(Type type, ExplicitArguments args); PluginGraph PluginGraph { get; } + void EjectAllInstancesOf<T>(); } } \ No newline at end of file Modified: trunk/Source/StructureMap/IInstanceFactory.cs =================================================================== --- trunk/Source/StructureMap/IInstanceFactory.cs 2008-10-02 18:44:00 UTC (rev 162) +++ trunk/Source/StructureMap/IInstanceFactory.cs 2008-10-03 14:47:59 UTC (rev 163) @@ -1,5 +1,6 @@ using System; using System.Collections; +using System.Collections.Generic; using StructureMap.Graph; using StructureMap.Pipeline; @@ -11,6 +12,8 @@ public interface IInstanceFactory { Type PluginType { get; } + IEnumerable<IInstance> Instances { get; } + IBuildPolicy Policy { get; } void AddInstance(Instance instance); Instance AddType<T>(); Modified: trunk/Source/StructureMap/InstanceFactory.cs =================================================================== --- trunk/Source/StructureMap/InstanceFactory.cs 2008-10-02 18:44:00 UTC (rev 162) +++ trunk/Source/StructureMap/InstanceFactory.cs 2008-10-03 14:47:59 UTC (rev 163) @@ -79,6 +79,16 @@ get { return _pluginType; } } + public IEnumerable<IInstance> Instances + { + get { return _instances.GetAll(); } + } + + public IBuildPolicy Policy + { + get { return _policy; } + } + public void ForEachInstance(Action<Instance> action) { _instances.Each(action); Modified: trunk/Source/StructureMap/ObjectFactory.cs =================================================================== --- trunk/Source/StructureMap/ObjectFactory.cs 2008-10-02 18:44:00 UTC (rev 162) +++ trunk/Source/StructureMap/ObjectFactory.cs 2008-10-03 14:47:59 UTC (rev 163) @@ -2,8 +2,6 @@ using System.Collections; using System.Collections.Generic; using System.Security.Permissions; -using StructureMap.Configuration.DSL; -using StructureMap.Diagnostics; using StructureMap.Graph; using StructureMap.Pipeline; @@ -14,7 +12,7 @@ /// <summary> /// The main static Facade for the StructureMap container /// </summary> - [EnvironmentPermission(SecurityAction.Assert, Read="COMPUTERNAME")] + [EnvironmentPermission(SecurityAction.Assert, Read = "COMPUTERNAME")] public class ObjectFactory { private static readonly object _lockObject = new object(); @@ -44,17 +42,17 @@ public static void Initialize(Action<InitializationExpression> action) { - lock (typeof(ObjectFactory)) + lock (typeof (ObjectFactory)) { - InitializationExpression expression = new InitializationExpression(); + var expression = new InitializationExpression(); action(expression); - var graph = expression.BuildGraph(); + PluginGraph graph = expression.BuildGraph(); StructureMapConfiguration.Seal(); _container = new Container(graph); Profile = expression.DefaultProfileName; - } + } } @@ -94,30 +92,26 @@ [Obsolete("Please use Inject() instead.")] public static void InjectStub<PLUGINTYPE>(PLUGINTYPE stub) { - Inject<PLUGINTYPE>(stub); + Inject(stub); } public static void Inject<PLUGINTYPE>(PLUGINTYPE instance) { - container.Inject<PLUGINTYPE>(instance); + container.Inject(instance); } public static void Inject<PLUGINTYPE>(string name, PLUGINTYPE instance) { - container.Inject<PLUGINTYPE>(name, instance); + container.Inject(name, instance); } [Obsolete("Please use Inject<PLUGINTYPE>(name) instead.")] public static void InjectStub<PLUGINTYPE>(string name, PLUGINTYPE stub) { - Inject<PLUGINTYPE>(name, stub); + Inject(name, stub); } - - - - public static string WhatDoIHave() { return container.WhatDoIHave(); @@ -128,7 +122,114 @@ container.AssertConfigurationIsValid(); } + /// <summary> + /// Returns and/or constructs the default instance of the requested System.Type + /// </summary> + /// <param name="pluginType"></param> + /// <returns></returns> + public static object GetInstance(Type pluginType) + { + return container.GetInstance(pluginType); + } + /// <summary> + /// Returns and/or constructs the default instance of the requested System.Type + /// </summary> + /// <typeparam name="PLUGINTYPE"></typeparam> + /// <returns></returns> + public static PLUGINTYPE GetInstance<PLUGINTYPE>() + { + return (PLUGINTYPE) container.GetInstance(typeof (PLUGINTYPE)); + } + + public static object GetInstance(Type TargetType, Instance instance) + { + return container.GetInstance(TargetType, instance); + } + + public static TargetType GetInstance<TargetType>(Instance instance) + { + return (TargetType) container.GetInstance(typeof (TargetType), instance); + } + + /// <summary> + /// Retrieves an instance of pluginType by name + /// </summary> + /// <param name="pluginType">The PluginType</param> + /// <param name="name">The instance name</param> + /// <returns></returns> + public static object GetNamedInstance(Type pluginType, string name) + { + return container.GetInstance(pluginType, name); + } + + /// <summary> + /// Retrieves an instance of PLUGINTYPE by name + /// </summary> + /// <typeparam name="PLUGINTYPE">The PluginType</typeparam> + /// <param name="name">The instance name</param> + /// <returns></returns> + public static PLUGINTYPE GetNamedInstance<PLUGINTYPE>(string name) + { + return (PLUGINTYPE) container.GetInstance(typeof (PLUGINTYPE), name); + } + + public static void SetDefaultInstanceName(Type TargetType, string InstanceName) + { + container.SetDefault(TargetType, InstanceName); + } + + public static void SetDefaultInstanceName<TargetType>(string InstanceName) + { + container.SetDefault(typeof (TargetType), InstanceName); + } + + /// <summary> + /// Retrieves all instances of the pluginType + /// </summary> + /// <param name="pluginType"></param> + /// <returns></returns> + public static IList GetAllInstances(Type pluginType) + { + return container.GetAllInstances(pluginType); + } + + /// <summary> + /// Retrieves all instances of the PLUGINTYPE + /// </summary> + /// <typeparam name="PLUGINTYPE"></typeparam> + /// <returns></returns> + public static IList<PLUGINTYPE> GetAllInstances<PLUGINTYPE>() + { + return container.GetAllInstances<PLUGINTYPE>(); + } + + /// <summary> + /// Pass in an explicit argument of Type T + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="arg"></param> + /// <returns></returns> + public static ExplicitArgsExpression With<T>(T arg) + { + return container.With(arg); + } + + /// <summary> + /// Pass in an explicit argument by name + /// </summary> + /// <param name="argName"></param> + /// <returns></returns> + public static IExplicitProperty With(string argName) + { + return container.With(argName); + } + + public static void EjectAllInstancesOf<T>() + { + container.EjectAllInstancesOf<T>(); + } + #region Container and setting defaults private static IContainer container @@ -149,7 +250,6 @@ return _container; } } - public static string Profile @@ -185,7 +285,7 @@ { container.SetDefault(pluginType, instance); } - + public static void SetDefault<PLUGINTYPE>(Instance instance) { container.SetDefault<PLUGINTYPE>(instance); @@ -232,120 +332,12 @@ PluginGraph graph = StructureMapConfiguration.GetPluginGraph(); StructureMapConfiguration.Seal(); - Container container = new Container(graph); + var container = new Container(graph); container.SetDefaultsToProfile(_profile); return container; } #endregion - - - /// <summary> - /// Returns and/or constructs the default instance of the requested System.Type - /// </summary> - /// <param name="pluginType"></param> - /// <returns></returns> - public static object GetInstance(Type pluginType) - { - return container.GetInstance(pluginType); - } - - /// <summary> - /// Returns and/or constructs the default instance of the requested System.Type - /// </summary> - /// <typeparam name="PLUGINTYPE"></typeparam> - /// <returns></returns> - public static PLUGINTYPE GetInstance<PLUGINTYPE>() - { - return (PLUGINTYPE) container.GetInstance(typeof (PLUGINTYPE)); - } - - public static object GetInstance(Type TargetType, Instance instance) - { - return container.GetInstance(TargetType, instance); - } - - public static TargetType GetInstance<TargetType>(Instance instance) - { - return (TargetType) container.GetInstance(typeof (TargetType), instance); - } - - /// <summary> - /// Retrieves an instance of pluginType by name - /// </summary> - /// <param name="pluginType">The PluginType</param> - /// <param name="name">The instance name</param> - /// <returns></returns> - public static object GetNamedInstance(Type pluginType, string name) - { - return container.GetInstance(pluginType, name); - } - - /// <summary> - /// Retrieves an instance of PLUGINTYPE by name - /// </summary> - /// <typeparam name="PLUGINTYPE">The PluginType</typeparam> - /// <param name="name">The instance name</param> - /// <returns></returns> - public static PLUGINTYPE GetNamedInstance<PLUGINTYPE>(string name) - { - return (PLUGINTYPE) container.GetInstance(typeof (PLUGINTYPE), name); - } - - public static void SetDefaultInstanceName(Type TargetType, string InstanceName) - { - container.SetDefault(TargetType, InstanceName); - } - - public static void SetDefaultInstanceName<TargetType>(string InstanceName) - { - container.SetDefault(typeof (TargetType), InstanceName); - } - - /// <summary> - /// Retrieves all instances of the pluginType - /// </summary> - /// <param name="pluginType"></param> - /// <returns></returns> - public static IList GetAllInstances(Type pluginType) - { - return container.GetAllInstances(pluginType); - } - - /// <summary> - /// Retrieves all instances of the PLUGINTYPE - /// </summary> - /// <typeparam name="PLUGINTYPE"></typeparam> - /// <returns></returns> - public static IList<PLUGINTYPE> GetAllInstances<PLUGINTYPE>() - { - return container.GetAllInstances<PLUGINTYPE>(); - } - - /// <summary> - /// Pass in an explicit argument of Type T - /// </summary> - /// <typeparam name="T"></typeparam> - /// <param name="arg"></param> - /// <returns></returns> - public static ExplicitArgsExpression With<T>(T arg) - { - return container.With(arg); - } - - /// <summary> - /// Pass in an explicit argument by name - /// </summary> - /// <param name="argName"></param> - /// <returns></returns> - public static IExplicitProperty With(string argName) - { - return container.With(argName); - } - - } - - } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs 2008-10-02 18:44:00 UTC (rev 162) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs 2008-10-03 14:47:59 UTC (rev 163) @@ -46,7 +46,7 @@ protected override string getDescription() { - string typeName = TypePath.GetAssemblyQualifiedName(_pluggedType); + string typeName = _pluggedType.AssemblyQualifiedName; Constructor ctor = new Constructor(_pluggedType); if (ctor.HasArguments()) { Modified: trunk/Source/StructureMap/Pipeline/Instance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/Instance.cs 2008-10-02 18:44:00 UTC (rev 162) +++ trunk/Source/StructureMap/Pipeline/Instance.cs 2008-10-03 14:47:59 UTC (rev 163) @@ -16,14 +16,20 @@ } } - public interface IDiagnosticInstance + public interface IInstance { + string Name { get; } + Type ConcreteType { get; } + string Description { get; } + } + + public interface IDiagnosticInstance : IInstance + { bool CanBePartOfPluginFamily(PluginFamily family); Instance FindInstanceForProfile(PluginFamily family, string profileName, GraphLog log); InstanceToken CreateToken(); void Preprocess(PluginFamily family); void AddTemplatedInstanceTo(PluginFamily family, Type[] templateTypes); - Type ConcreteType { get; } } public abstract class Instance : IDiagnosticInstance @@ -126,11 +132,16 @@ addTemplatedInstanceTo(family, templateTypes); } - Type IDiagnosticInstance.ConcreteType + Type IInstance.ConcreteType { get { return getConcreteType(null); } } + string IInstance.Description + { + get { return getDescription(); } + } + protected virtual Type getConcreteType(Type pluginType) { return pluginType; Modified: trunk/Source/StructureMap/Pipeline/Profile.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/Profile.cs 2008-10-02 18:44:00 UTC (rev 162) +++ trunk/Source/StructureMap/Pipeline/Profile.cs 2008-10-03 14:47:59 UTC (rev 163) @@ -108,5 +108,9 @@ } + public void Remove<T>() + { + _instances.Remove(typeof (T)); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/ProfileManager.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ProfileManager.cs 2008-10-02 18:44:00 UTC (rev 162) +++ trunk/Source/StructureMap/Pipeline/ProfileManager.cs 2008-10-03 14:47:59 UTC (rev 163) @@ -231,5 +231,14 @@ CurrentProfile = CurrentProfile; } + + public void EjectAllInstancesOf<T>() + { + _currentProfile.Remove<T>(); + foreach (var pair in _profiles) + { + pair.Value.Remove<T>(); + } + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/PipelineGraph.cs =================================================================== --- trunk/Source/StructureMap/PipelineGraph.cs 2008-10-02 18:44:00 UTC (rev 162) +++ trunk/Source/StructureMap/PipelineGraph.cs 2008-10-03 14:47:59 UTC (rev 163) @@ -3,17 +3,28 @@ using StructureMap.Diagnostics; using StructureMap.Graph; using StructureMap.Pipeline; +using System.Linq; namespace StructureMap { public delegate InstanceFactory MissingFactoryFunction(Type pluginType, ProfileManager profileManager); + [Obsolete("I think we can eliminate this in favor of IEnumerable")] public interface IPipelineGraphVisitor { void PluginType(Type pluginType, Instance defaultInstance, IBuildPolicy policy); void Instance(Type pluginType, Instance instance); } + public class PluginTypeConfiguration + { + public Type PluginType { get; set; } + public IInstance Instance { get; set; } + public IBuildPolicy Policy { get; set; } + + public IEnumerable<IInstance> Instances { get; set; } + } + public class PipelineGraph { private readonly Dictionary<Type, IInstanceFactory> _factories @@ -166,6 +177,7 @@ public void SetDefault(Type pluginType, Instance instance) { createFactoryIfMissing(pluginType); + ForType(pluginType).AddInstance(instance); _profileManager.SetDefault(pluginType, instance); } @@ -195,6 +207,43 @@ public void EjectAllInstancesOf<T>() { ForType(typeof (T)).EjectAllInstances(); + _profileManager.EjectAllInstancesOf<T>(); } + + public IEnumerable<IInstance> InstancesOf(Type pluginType) + { + if (_genericsGraph.HasFamily(pluginType)) + { + return _genericsGraph.FindFamily(pluginType).Instances; + } + + return ForType(pluginType).Instances; + } + + public IEnumerable<PluginTypeConfiguration> PluginTypes + { + get + { + foreach (PluginTypeConfiguration configuration in _genericsGraph.Families) + { + yield return configuration; + } + + foreach (var pair in _factories) + { + var factory = pair.Value; + + yield return new PluginTypeConfiguration() + { + Instance = _profileManager.GetDefault(factory.PluginType), + PluginType = factory.PluginType, + Policy = factory.Policy, + Instances = factory.Instances + }; + } + } + + + } } } \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryIntegratedTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryIntegratedTester.cs 2008-10-02 18:44:00 UTC (rev 162) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryIntegratedTester.cs 2008-10-03 14:47:59 UTC (rev 163) @@ -27,7 +27,11 @@ [Test] public void AutomaticallyFindRegistryFromAssembly() { - ObjectFactory.Initialize(x => { x.Scan(s => { s.AssemblyContainingType<RedGreenRegistry>(); }); }); + ObjectFactory.Initialize(x => { x.Scan(s => + { + s.AssemblyContainingType<RedGreenRegistry>(); + s.LookForRegistries(); + }); }); var colors = new List<string>(); foreach (IWidget widget in ObjectFactory.GetAllInstances<IWidget>()) @@ -57,6 +61,7 @@ var scanner = new AssemblyScanner(); scanner.AssemblyContainingType(typeof (RedGreenRegistry)); + scanner.LookForRegistries(); scanner.ScanForAll(graph); graph.Seal(); Modified: trunk/Source/StructureMap.Testing/Graph/GenericsPluginGraphTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/GenericsPluginGraphTester.cs 2008-10-02 18:44:00 UTC (rev 162) +++ trunk/Source/StructureMap.Testing/Graph/GenericsPluginGraphTester.cs 2008-10-03 14:47:59 UTC (rev 163) @@ -1,7 +1,10 @@ using System; using NUnit.Framework; +using StructureMap.Configuration.DSL; using StructureMap.Graph; using StructureMap.Pipeline; +using StructureMap.Testing.GenericWidgets; +using System.Linq; namespace StructureMap.Testing.Graph { @@ -27,7 +30,16 @@ Assert.IsFalse(GenericsPluginGraph.CanBeCast(pluginType, pluggedType)); } + [Test] + public void can_iterate_through_families() + { + GenericsPluginGraph graph = new GenericsPluginGraph(); + graph.FindFamily(typeof(IGenericService<>)).AddType(typeof(GenericService<>)); + graph.FindFamily(typeof(IService<>)).AddType(typeof(Service<>)); + graph.Families.Count().ShouldEqual(2); + } + [Test] public void Check_the_generic_plugin_family_expression() { Modified: trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs 2008-10-02 18:44:00 UTC (rev 162) +++ trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs 2008-10-03 14:47:59 UTC (rev 163) @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Data; +using System.Linq; using System.Reflection; using NUnit.Framework; using StructureMap.Attributes; @@ -33,6 +34,29 @@ } [Test] + public void can_get_configuration_object_from_PluginFamily() + { + PluginFamily family = new PluginFamily(typeof(IWidget)); + + var instance1 = new SmartInstance<ColorWidget>().WithCtorArg("color").EqualTo("Red"); + var instance2 = new SmartInstance<ColorWidget>().WithCtorArg("color").EqualTo("Blue"); + + family.AddInstance(instance1); + family.AddInstance(instance2); + + family.DefaultInstanceKey = instance1.Name; + + var configuration = family.GetConfiguration(); + + configuration.Instance.ShouldBeTheSameAs(instance1); + configuration.PluginType.ShouldEqual(typeof (IWidget)); + configuration.Policy.ShouldBeTheSameAs(family.Policy); + + configuration.Instances.Count().ShouldEqual(2); + } + + + [Test] public void add_plugins_at_seal_from_the_list_of_types() { var family = new PluginFamily(typeof (IServiceProvider)); Modified: trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs 2008-10-02 18:44:00 UTC (rev 162) +++ trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs 2008-10-03 14:47:59 UTC (rev 163) @@ -138,7 +138,7 @@ public void Create_description_if_has_plugged_type_and_plugged_type_has_no_arguments() { var instance = new ConfiguredInstance(GetType()); - TestUtility.AssertDescriptionIs(instance, TypePath.GetAssemblyQualifiedName(GetType())); + TestUtility.AssertDescriptionIs(instance, GetType().AssemblyQualifiedName); } [Test] @@ -146,7 +146,7 @@ { var instance = new ConfiguredInstance(typeof (ColorService)); TestUtility.AssertDescriptionIs(instance, - "Configured " + TypePath.GetAssemblyQualifiedName(typeof (ColorService))); + "Configured " + typeof (ColorService).AssemblyQualifiedName); } [Test] Modified: trunk/Source/StructureMap.Testing/PipelineGraphTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/PipelineGraphTester.cs 2008-10-02 18:44:00 UTC (rev 162) +++ trunk/Source/StructureMap.Testing/PipelineGraphTester.cs 2008-10-03 14:47:59 UTC (rev 163) @@ -1,12 +1,15 @@ using System; +using System.Diagnostics; using NUnit.Framework; using Rhino.Mocks; using Rhino.Mocks.Constraints; using StructureMap.Configuration.DSL; using StructureMap.Graph; using StructureMap.Pipeline; +using StructureMap.Testing.GenericWidgets; using StructureMap.Testing.Graph; using StructureMap.Testing.Widget; +using System.Linq; namespace StructureMap.Testing { @@ -62,8 +65,80 @@ LastCall.Constraints(Is.Equal(typeof(ISomething)), Is.TypeOf(typeof(SmartInstance<SomethingTwo>))); }); } + + [Test] + public void can_iterate_through_instances_of_pipelineGraph_for_generics_if_not_registered() + { + PipelineGraph pipeline = new PipelineGraph(new PluginGraph()); + pipeline.InstancesOf(typeof(IService<>)).Count().ShouldEqual(0); + } [Test] + public void can_iterate_through_families_including_both_generics_and_normal() + { + Registry registry = new Registry(); + registry.ForRequestedType(typeof(IService<>)) + .AddConcreteType(typeof(Service<>)) + .AddConcreteType(typeof(Service2<>)); + + registry.BuildInstancesOf<ISomething>() + .TheDefaultIsConcreteType<SomethingOne>() + .AddConcreteType<SomethingTwo>(); + + PluginGraph graph = registry.Build(); + PipelineGraph pipeline = new PipelineGraph(graph); + + pipeline.PluginTypes.Count().ShouldEqual(2); + } + + [Test] + public void can_iterate_through_instance_of_pipelineGraph_for_generics() + { + Registry registry = new Registry(); + registry.ForRequestedType(typeof (IService<>)) + .AddConcreteType(typeof (Service<>)) + .AddConcreteType(typeof (Service2<>)); + + var graph = registry.Build(); + var pipeline = new PipelineGraph(graph); + + foreach (var instance in pipeline.InstancesOf(typeof(IService<>))) + { + Debug.WriteLine(instance.Description); + } + + pipeline.InstancesOf(typeof (IService<>)).Count().ShouldEqual(2); + } + + [Test] + public void can_iterate_through_instances_of_pipelineGraph_on_a_type_that_is_registered() + { + Registry registry = new Registry(); + registry.BuildInstancesOf<ISomething>() + .TheDefaultIsConcreteType<SomethingOne>() + .AddConcreteType<SomethingTwo>(); + + PluginGraph graph = registry.Build(); + + PipelineGraph pipeline = new PipelineGraph(graph); + + pipeline.InstancesOf(typeof(ISomething)).Count().ShouldEqual(2); + + pipeline.Inject<ISomething>(new SomethingTwo()); + + pipeline.InstancesOf(typeof(ISomething)).Count().ShouldEqual(3); + } + + [Test] + public void can_iterate_through_empty_array_of_pipelineGraph_for_a_type_that_is_not_registered() + { + PluginGraph graph = new PluginGraph(); + PipelineGraph pipeline = new PipelineGraph(graph); + + pipeline.InstancesOf(typeof(ISomething)).Count().ShouldEqual(0); + } + + [Test] public void Visit_a_single_family_with_no_default() { Registry registry = new Registry(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |