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