From: <jer...@us...> - 2008-10-03 16:24:42
|
Revision: 166 http://structuremap.svn.sourceforge.net/structuremap/?rev=166&view=rev Author: jeremydmiller Date: 2008-10-03 16:24:32 +0000 (Fri, 03 Oct 2008) Log Message: ----------- the ability to query what StructureMap has Modified Paths: -------------- trunk/Source/StructureMap/Container.cs trunk/Source/StructureMap/Graph/Constructor.cs trunk/Source/StructureMap/IContainer.cs trunk/Source/StructureMap/ObjectFactory.cs trunk/Source/StructureMap/PipelineGraph.cs trunk/Source/StructureMap/StructureMap.csproj trunk/Source/StructureMap.Testing/Graph/PluginTester.cs trunk/Source/StructureMap.Testing/ObjectFactoryTester.cs trunk/Source/StructureMap.Testing/PipelineGraphTester.cs trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj Added Paths: ----------- trunk/Source/StructureMap/Model.cs trunk/Source/StructureMap.Testing/ModelQueryTester.cs Modified: trunk/Source/StructureMap/Container.cs =================================================================== --- trunk/Source/StructureMap/Container.cs 2008-10-03 15:36:06 UTC (rev 165) +++ trunk/Source/StructureMap/Container.cs 2008-10-03 16:24:32 UTC (rev 166) @@ -20,6 +20,7 @@ private InterceptorLibrary _interceptorLibrary; private PipelineGraph _pipelineGraph; private PluginGraph _pluginGraph; + private Model _model; public Container(Action<ConfigurationExpression> action) { @@ -66,6 +67,7 @@ pluginGraph.Log.AssertFailures(); _pipelineGraph = new PipelineGraph(pluginGraph); + _model = new Model(_pipelineGraph); PluginCache.Compile(); } @@ -77,6 +79,11 @@ #region IContainer Members + public Model Model + { + get { return _model; } + } + public T GetInstance<T>(string instanceKey) { return (T) GetInstance(typeof (T), instanceKey); Modified: trunk/Source/StructureMap/Graph/Constructor.cs =================================================================== --- trunk/Source/StructureMap/Graph/Constructor.cs 2008-10-03 15:36:06 UTC (rev 165) +++ trunk/Source/StructureMap/Graph/Constructor.cs 2008-10-03 16:24:32 UTC (rev 166) @@ -64,6 +64,8 @@ public bool CanBeAutoFilled() { + if (_ctor == null) return false; + foreach (ParameterInfo parameter in _ctor.GetParameters()) { if (!IsAutoFillable(parameter.ParameterType)) Modified: trunk/Source/StructureMap/IContainer.cs =================================================================== --- trunk/Source/StructureMap/IContainer.cs 2008-10-03 15:36:06 UTC (rev 165) +++ trunk/Source/StructureMap/IContainer.cs 2008-10-03 16:24:32 UTC (rev 166) @@ -9,6 +9,8 @@ { public interface IContainer { + Model Model { get; } + T GetInstance<T>(string instanceKey); T GetInstance<T>(); T FillDependencies<T>(); Added: trunk/Source/StructureMap/Model.cs =================================================================== --- trunk/Source/StructureMap/Model.cs (rev 0) +++ trunk/Source/StructureMap/Model.cs 2008-10-03 16:24:32 UTC (rev 166) @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using StructureMap.Graph; +using StructureMap.Pipeline; + +namespace StructureMap +{ + public class Model : TypeRules + { + private readonly PipelineGraph _graph; + + internal Model(PipelineGraph graph) + { + _graph = graph; + } + + public bool HasDefaultImplementationFor(Type pluginType) + { + var family = PluginTypes.FirstOrDefault(x => x.PluginType == pluginType); + return family == null ? false : family.Default != null; + } + + public bool HasDefaultImplementationFor<T>() + { + return HasDefaultImplementationFor(typeof (T)); + } + + public IEnumerable<PluginTypeConfiguration> PluginTypes + { + get + { + return _graph.PluginTypes; + } + } + + public IEnumerable<IInstance> InstancesOf(Type pluginType) + { + return _graph.InstancesOf(pluginType); + } + + public IEnumerable<IInstance> InstancesOf<T>() + { + return _graph.InstancesOf(typeof(T)); + } + + public bool HasImplementationsFor(Type pluginType) + { + return _graph.InstancesOf(pluginType).Count() > 0; + } + + public bool HasImplementationsFor<T>() + { + return HasImplementationsFor(typeof(T)); + } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap/ObjectFactory.cs =================================================================== --- trunk/Source/StructureMap/ObjectFactory.cs 2008-10-03 15:36:06 UTC (rev 165) +++ trunk/Source/StructureMap/ObjectFactory.cs 2008-10-03 16:24:32 UTC (rev 166) @@ -105,6 +105,14 @@ container.Inject(name, instance); } + public static Model Model + { + get + { + return container.Model; + } + } + [Obsolete("Please use Inject<PLUGINTYPE>(name) instead.")] public static void InjectStub<PLUGINTYPE>(string name, PLUGINTYPE stub) { Modified: trunk/Source/StructureMap/PipelineGraph.cs =================================================================== --- trunk/Source/StructureMap/PipelineGraph.cs 2008-10-03 15:36:06 UTC (rev 165) +++ trunk/Source/StructureMap/PipelineGraph.cs 2008-10-03 16:24:32 UTC (rev 166) @@ -173,7 +173,12 @@ return _genericsGraph.FindFamily(pluginType).Instances; } - return ForType(pluginType).Instances; + if (_factories.ContainsKey(pluginType)) + { + return _factories[pluginType].Instances; + } + + return new IInstance[0]; } public IEnumerable<PluginTypeConfiguration> PluginTypes Modified: trunk/Source/StructureMap/StructureMap.csproj =================================================================== --- trunk/Source/StructureMap/StructureMap.csproj 2008-10-03 15:36:06 UTC (rev 165) +++ trunk/Source/StructureMap/StructureMap.csproj 2008-10-03 16:24:32 UTC (rev 166) @@ -410,6 +410,7 @@ <Compile Include="Graph\PluginCache.cs" /> <Compile Include="IBootstrapper.cs" /> <Compile Include="InitializationExpression.cs" /> + <Compile Include="Model.cs" /> <Compile Include="Pipeline\BuildFrame.cs" /> <Compile Include="Pipeline\BuildStack.cs" /> <Compile Include="Pipeline\ConfiguredInstanceBase.cs" /> Modified: trunk/Source/StructureMap.Testing/Graph/PluginTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/PluginTester.cs 2008-10-03 15:36:06 UTC (rev 165) +++ trunk/Source/StructureMap.Testing/Graph/PluginTester.cs 2008-10-03 16:24:32 UTC (rev 166) @@ -112,7 +112,19 @@ container.GetInstance<IEngine>(instance).ShouldBeOfType(typeof (DOHCEngine)); } + public class ClassWithNoConstructor + { + private ClassWithNoConstructor(){} + } + [Test] + public void cannot_be_auto_filled_with_no_contructors() + { + var plugin = new Plugin(typeof (ClassWithNoConstructor)); + plugin.CanBeAutoFilled.ShouldBeFalse(); + } + + [Test] public void CanBeAutoFilled_with_child_array_in_ctor() { var ctor = new Constructor(typeof (CanBeAutoFilledWithArray)); Added: trunk/Source/StructureMap.Testing/ModelQueryTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/ModelQueryTester.cs (rev 0) +++ trunk/Source/StructureMap.Testing/ModelQueryTester.cs 2008-10-03 16:24:32 UTC (rev 166) @@ -0,0 +1,104 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using NUnit.Framework; +using StructureMap.Configuration.DSL; +using StructureMap.Graph; +using StructureMap.Testing.GenericWidgets; +using StructureMap.Testing.Graph; + +namespace StructureMap.Testing +{ + [TestFixture] + public class ModelQueryTester + { + private Model _model; + private Container _container; + + [SetUp] + public void SetUp() + { + Registry registry = new Registry(); + registry.ForRequestedType(typeof(IService<>)) + .AddConcreteType(typeof(Service<>)) + .AddConcreteType(typeof(Service2<>)); + + registry.BuildInstancesOf<ISomething>() + .TheDefaultIsConcreteType<SomethingOne>() + .AddConcreteType<SomethingTwo>(); + + registry.BuildInstancesOf<IServiceProvider>().AddConcreteType<DataSet>().AddConcreteType<DataView>(); + + PluginGraph graph = registry.Build(); + PipelineGraph pipeline = new PipelineGraph(graph); + + _model = new Model(pipeline); + + _container = new Container(graph); + + } + + + [Test] + public void HasImplementationFor() + { + _model.HasDefaultImplementationFor(typeof(ISomething)).ShouldBeTrue(); + _model.HasDefaultImplementationFor(GetType()).ShouldBeFalse(); + _model.HasDefaultImplementationFor(typeof(IServiceProvider)).ShouldBeFalse(); + } + + [Test] + public void HasImplementationsFor() + { + _model.HasImplementationsFor(typeof(ISomething)).ShouldBeTrue(); + _model.HasImplementationsFor(GetType()).ShouldBeFalse(); + _model.HasImplementationsFor(typeof(IServiceProvider)).ShouldBeTrue(); + } + + [Test] + public void Iterate_over_pluginTypes() + { + _model.PluginTypes.Count().ShouldEqual(3); + } + + [Test] + public void iterate_over_instances_of_a_type() + { + _model.InstancesOf(typeof (IServiceProvider)).Count().ShouldEqual(2); + _model.InstancesOf(typeof (IService<>)).Count().ShouldEqual(2); + _model.InstancesOf<IServiceProvider>().Count().ShouldEqual(2); + } + + [Test] + public void HasImplementationFor_w_container() + { + _container.Model.HasDefaultImplementationFor(typeof(ISomething)).ShouldBeTrue(); + _container.Model.HasDefaultImplementationFor(GetType()).ShouldBeFalse(); + _container.Model.HasDefaultImplementationFor(typeof(IServiceProvider)).ShouldBeFalse(); + } + + [Test] + public void HasImplementationsFor_w_container() + { + _container.Model.HasImplementationsFor(typeof(ISomething)).ShouldBeTrue(); + _container.Model.HasImplementationsFor(GetType()).ShouldBeFalse(); + _container.Model.HasImplementationsFor(typeof(IServiceProvider)).ShouldBeTrue(); + } + + [Test] + public void Iterate_over_pluginTypes_w_container() + { + _container.Model.PluginTypes.Count().ShouldEqual(3); + } + + [Test] + public void iterate_over_instances_of_a_type_w_container() + { + _container.Model.InstancesOf(typeof (IServiceProvider)).Count().ShouldEqual(2); + _container.Model.InstancesOf(typeof (IService<>)).Count().ShouldEqual(2); + _container.Model.InstancesOf<IServiceProvider>().Count().ShouldEqual(2); + } + } +} Modified: trunk/Source/StructureMap.Testing/ObjectFactoryTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/ObjectFactoryTester.cs 2008-10-03 15:36:06 UTC (rev 165) +++ trunk/Source/StructureMap.Testing/ObjectFactoryTester.cs 2008-10-03 16:24:32 UTC (rev 166) @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Diagnostics; +using System.Linq; using System.Threading; using System.Xml; using NUnit.Framework; @@ -31,6 +32,12 @@ } [Test] + public void SmokeTestModelAccess() + { + ObjectFactory.Model.PluginTypes.Count().ShouldBeGreaterThan(0); + } + + [Test] public void SmokeTestGetAllInstancesGeneric() { IList<GrandChild> list = ObjectFactory.GetAllInstances<GrandChild>(); Modified: trunk/Source/StructureMap.Testing/PipelineGraphTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/PipelineGraphTester.cs 2008-10-03 15:36:06 UTC (rev 165) +++ trunk/Source/StructureMap.Testing/PipelineGraphTester.cs 2008-10-03 16:24:32 UTC (rev 166) @@ -25,9 +25,6 @@ #endregion - - - [Test] public void can_iterate_through_instances_of_pipelineGraph_for_generics_if_not_registered() { @@ -53,6 +50,7 @@ pipeline.PluginTypes.Count().ShouldEqual(2); } + [Test] public void can_iterate_through_instance_of_pipelineGraph_for_generics() { Modified: trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj =================================================================== --- trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2008-10-03 15:36:06 UTC (rev 165) +++ trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2008-10-03 16:24:32 UTC (rev 166) @@ -349,6 +349,7 @@ <Compile Include="InstanceMementoInstanceCreationTester.cs" /> <Compile Include="MementoTester.cs" /> <Compile Include="MergingTester.cs" /> + <Compile Include="ModelQueryTester.cs" /> <Compile Include="ObjectFactoryInitializeTester.cs" /> <Compile Include="ObjectFactoryTester.cs"> <SubType>Code</SubType> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |