|
From: <jer...@us...> - 2008-09-24 22:34:16
|
Revision: 154
http://structuremap.svn.sourceforge.net/structuremap/?rev=154&view=rev
Author: jeremydmiller
Date: 2008-09-24 21:47:17 +0000 (Wed, 24 Sep 2008)
Log Message:
-----------
mostly fixes for RhinoAutoMocker
Modified Paths:
--------------
trunk/Source/StructureMap/BuildSession.cs
trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs
trunk/Source/StructureMap/Container.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/ConstructorInstance.cs
trunk/Source/StructureMap/PipelineGraph.cs
trunk/Source/StructureMap.AutoMocking/AutoMockedContainer.cs
trunk/Source/StructureMap.AutoMocking/RhinoAutoMocker.cs
trunk/Source/StructureMap.Testing/AutoMocking/RhinoAutoMockerTester.cs
trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs
Modified: trunk/Source/StructureMap/BuildSession.cs
===================================================================
--- trunk/Source/StructureMap/BuildSession.cs 2008-09-17 14:09:19 UTC (rev 153)
+++ trunk/Source/StructureMap/BuildSession.cs 2008-09-24 21:47:17 UTC (rev 154)
@@ -8,8 +8,17 @@
namespace StructureMap
{
- public class BuildSession
+ public interface IContext
{
+ T GetInstance<T>();
+
+
+ BuildStack BuildStack { get; }
+ Type ParentType { get; }
+ }
+
+ public class BuildSession : IContext
+ {
private readonly InterceptorLibrary _interceptorLibrary;
private readonly PipelineGraph _pipelineGraph;
private readonly InstanceCache _cache = new InstanceCache();
@@ -134,5 +143,10 @@
{
return _pipelineGraph.ForType(pluginType);
}
+
+ T IContext.GetInstance<T>()
+ {
+ return (T) CreateInstance(typeof (T));
+ }
}
}
\ No newline at end of file
Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs
===================================================================
--- trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs 2008-09-17 14:09:19 UTC (rev 153)
+++ trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs 2008-09-24 21:47:17 UTC (rev 154)
@@ -33,6 +33,11 @@
return returnInstance(new SmartInstance<PLUGGEDTYPE>());
}
+ public ConfiguredInstance OfConcreteType(Type type)
+ {
+ return returnInstance(new ConfiguredInstance(type));
+ }
+
public LiteralInstance Object(T theObject)
{
return returnInstance(new LiteralInstance(theObject));
@@ -58,7 +63,7 @@
return returnInstance(new ConstructorInstance<T>(func));
}
- public ConstructorInstance<T> ConstructedBy(Func<BuildSession, T> func)
+ public ConstructorInstance<T> ConstructedBy(Func<IContext, T> func)
{
return returnInstance(new ConstructorInstance<T>(func));
}
Modified: trunk/Source/StructureMap/Container.cs
===================================================================
--- trunk/Source/StructureMap/Container.cs 2008-09-17 14:09:19 UTC (rev 153)
+++ trunk/Source/StructureMap/Container.cs 2008-09-24 21:47:17 UTC (rev 154)
@@ -277,11 +277,11 @@
return forType(type).GetAllInstances(withNewSession());
}
- public void Configure(Action<Registry> configure)
+ public void Configure(Action<ConfigurationExpression> configure)
{
lock (this)
{
- Registry registry = new Registry();
+ ConfigurationExpression registry = new ConfigurationExpression();
configure(registry);
PluginGraph graph = registry.Build();
@@ -335,5 +335,9 @@
return _pipelineGraph.ForType(type);
}
+ public void EjectAllInstancesOf<T>()
+ {
+ _pipelineGraph.EjectAllInstancesOf<T>();
+ }
}
}
\ No newline at end of file
Modified: trunk/Source/StructureMap/IContainer.cs
===================================================================
--- trunk/Source/StructureMap/IContainer.cs 2008-09-17 14:09:19 UTC (rev 153)
+++ trunk/Source/StructureMap/IContainer.cs 2008-09-24 21:47:17 UTC (rev 154)
@@ -21,7 +21,7 @@
IList GetAllInstances(Type type);
- void Configure(Action<Registry> configure);
+ void Configure(Action<ConfigurationExpression> configure);
void Inject<PLUGINTYPE>(PLUGINTYPE instance);
void Inject(Type pluginType, object stub);
void Inject<T>(string name, T instance);
Modified: trunk/Source/StructureMap/IInstanceFactory.cs
===================================================================
--- trunk/Source/StructureMap/IInstanceFactory.cs 2008-09-17 14:09:19 UTC (rev 153)
+++ trunk/Source/StructureMap/IInstanceFactory.cs 2008-09-24 21:47:17 UTC (rev 154)
@@ -22,5 +22,6 @@
void ForEachInstance(Action<Instance> action);
void ImportFrom(PluginFamily family);
void AcceptVisitor(IPipelineGraphVisitor visitor, Instance defaultInstance);
+ void EjectAllInstances();
}
}
\ No newline at end of file
Modified: trunk/Source/StructureMap/InstanceFactory.cs
===================================================================
--- trunk/Source/StructureMap/InstanceFactory.cs 2008-09-17 14:09:19 UTC (rev 153)
+++ trunk/Source/StructureMap/InstanceFactory.cs 2008-09-24 21:47:17 UTC (rev 154)
@@ -135,5 +135,10 @@
visitor.PluginType(PluginType, defaultInstance, _policy);
ForEachInstance(i => visitor.Instance(PluginType, i));
}
+
+ public void EjectAllInstances()
+ {
+ _instances.Clear();
+ }
}
}
\ No newline at end of file
Modified: trunk/Source/StructureMap/ObjectFactory.cs
===================================================================
--- trunk/Source/StructureMap/ObjectFactory.cs 2008-09-17 14:09:19 UTC (rev 153)
+++ trunk/Source/StructureMap/ObjectFactory.cs 2008-09-24 21:47:17 UTC (rev 154)
@@ -176,7 +176,7 @@
_container = container;
}
- public static void Configure(Action<Registry> configure)
+ public static void Configure(Action<ConfigurationExpression> configure)
{
container.Configure(configure);
}
Modified: trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs
===================================================================
--- trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs 2008-09-17 14:09:19 UTC (rev 153)
+++ trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs 2008-09-24 21:47:17 UTC (rev 154)
@@ -6,9 +6,9 @@
public class ConstructorInstance<T> : ExpressedInstance<ConstructorInstance<T>>
{
- private readonly Func<BuildSession, T> _builder;
+ private readonly Func<IContext, T> _builder;
- public ConstructorInstance(Func<BuildSession, T> builder)
+ public ConstructorInstance(Func<IContext, T> builder)
{
_builder = builder;
}
Modified: trunk/Source/StructureMap/PipelineGraph.cs
===================================================================
--- trunk/Source/StructureMap/PipelineGraph.cs 2008-09-17 14:09:19 UTC (rev 153)
+++ trunk/Source/StructureMap/PipelineGraph.cs 2008-09-24 21:47:17 UTC (rev 154)
@@ -191,5 +191,10 @@
ForType(typeof (PLUGINTYPE)).AddInstance(literalInstance);
SetDefault(typeof (PLUGINTYPE), literalInstance);
}
+
+ public void EjectAllInstancesOf<T>()
+ {
+ ForType(typeof (T)).EjectAllInstances();
+ }
}
}
\ No newline at end of file
Modified: trunk/Source/StructureMap.AutoMocking/AutoMockedContainer.cs
===================================================================
--- trunk/Source/StructureMap.AutoMocking/AutoMockedContainer.cs 2008-09-17 14:09:19 UTC (rev 153)
+++ trunk/Source/StructureMap.AutoMocking/AutoMockedContainer.cs 2008-09-24 21:47:17 UTC (rev 154)
@@ -8,6 +8,10 @@
{
private readonly ServiceLocator _locator;
+ public AutoMockedContainer() : this(new RhinoMocksServiceLocator())
+ {
+ }
+
public AutoMockedContainer(ServiceLocator locator)
{
_locator = locator;
@@ -19,13 +23,21 @@
return null;
}
- object service = _locator.Service(pluginType);
InstanceFactory factory = new InstanceFactory(new PluginFamily(pluginType));
- LiteralInstance instance = new LiteralInstance(service);
+ try
+ {
+ object service = _locator.Service(pluginType);
- profileManager.SetDefault(pluginType, instance);
+ LiteralInstance instance = new LiteralInstance(service);
+ profileManager.SetDefault(pluginType, instance);
+ }
+ catch (Exception)
+ {
+ // ignore errors
+ }
+
return factory;
};
}
Modified: trunk/Source/StructureMap.AutoMocking/RhinoAutoMocker.cs
===================================================================
--- trunk/Source/StructureMap.AutoMocking/RhinoAutoMocker.cs 2008-09-17 14:09:19 UTC (rev 153)
+++ trunk/Source/StructureMap.AutoMocking/RhinoAutoMocker.cs 2008-09-24 21:47:17 UTC (rev 154)
@@ -60,8 +60,23 @@
foreach (ParameterInfo parameterInfo in ctor.GetParameters())
{
Type dependencyType = parameterInfo.ParameterType;
- object dependency = _container.GetInstance(dependencyType);
- list.Add(dependency);
+
+ if (dependencyType.IsArray)
+ {
+ var values = _container.GetAllInstances(dependencyType.GetElementType());
+ var array = Array.CreateInstance(dependencyType.GetElementType(), values.Count);
+ values.CopyTo(array, 0);
+
+ list.Add(array);
+
+ }
+ else
+ {
+ object dependency = _container.GetInstance(dependencyType);
+ list.Add(dependency);
+ }
+
+
}
return list.ToArray();
@@ -85,6 +100,19 @@
_container.Inject(pluginType, stub);
}
+ public void Inject<T>(T target)
+ {
+ _container.Inject<T>(target);
+ }
+
+ public T AddAdditionalMockFor<T>()
+ {
+ T mock = DynamicMock<T>();
+ _container.Configure(r => r.InstanceOf<T>().Is.Object(mock));
+
+ return mock;
+ }
+
// So that Aaron Jensen can use his concrete HubService object
// Construct whatever T is with all mocks, and make sure that the
// ClassUnderTest gets built with a concrete T
@@ -93,5 +121,36 @@
T concreteClass = _container.FillDependencies<T>();
_container.Inject(concreteClass);
}
+
+ public AutoMockedContainer Container
+ {
+ get { return _container; }
+ }
+
+ public T[] CreateMockArrayFor<T>(int count)
+ {
+ T[] returnValue = new T[count];
+
+ for (int i = 0; i < returnValue.Length; i++)
+ {
+ returnValue[i] = DynamicMock<T>();
+ }
+
+ InjectArray<T>(returnValue);
+
+ return returnValue;
+ }
+
+ public void InjectArray<T>(T[] stubs)
+ {
+ _container.EjectAllInstancesOf<T>();
+ _container.Configure(x =>
+ {
+ foreach (var t in stubs)
+ {
+ x.InstanceOf<T>().Is.Object(t);
+ }
+ });
+ }
}
}
\ No newline at end of file
Modified: trunk/Source/StructureMap.Testing/AutoMocking/RhinoAutoMockerTester.cs
===================================================================
--- trunk/Source/StructureMap.Testing/AutoMocking/RhinoAutoMockerTester.cs 2008-09-17 14:09:19 UTC (rev 153)
+++ trunk/Source/StructureMap.Testing/AutoMocking/RhinoAutoMockerTester.cs 2008-09-24 21:47:17 UTC (rev 154)
@@ -3,6 +3,8 @@
using Rhino.Mocks;
using Rhino.Mocks.Interfaces;
using StructureMap.AutoMocking;
+using StructureMap.Graph;
+using StructureMap.Testing.Widget3;
namespace StructureMap.Testing.AutoMocking
{
@@ -14,6 +16,8 @@
[SetUp]
public void SetUp()
{
+ PluginCache.ResetAll();
+
_mocks = new MockRepository();
_locator = new RhinoMocksServiceLocator(_mocks);
_container = new AutoMockedContainer(_locator);
@@ -129,7 +133,70 @@
#endregion
}
+ public class ClassWithArray
+ {
+ private IMockedService[] _services;
+
+ public ClassWithArray(IMockedService[] services)
+ {
+ _services = services;
+ }
+
+ public IMockedService[] Services
+ {
+ get { return _services; }
+ }
+ }
+
[Test]
+ public void CanInjectAnArrayOfMockServices1()
+ {
+ var mocker = new RhinoAutoMocker<ClassWithArray>();
+
+ IMockedService[] services = mocker.CreateMockArrayFor<IMockedService>(3);
+ ClassWithArray theClass = mocker.ClassUnderTest;
+
+ theClass.Services.Length.ShouldEqual(3);
+ }
+
+ [Test]
+ public void CanInjectAnArrayOfMockServices2()
+ {
+ var mocker = new RhinoAutoMocker<ClassWithArray>();
+
+ ClassWithArray theClass = mocker.ClassUnderTest;
+
+ theClass.Services.Length.ShouldEqual(0);
+ }
+
+
+ [Test]
+ public void CanInjectAnArrayOfMockServices3()
+ {
+ var mocker = new RhinoAutoMocker<ClassWithArray>();
+
+ IMockedService[] services = mocker.CreateMockArrayFor<IMockedService>(3);
+
+ mocker.PartialMockTheClassUnderTest();
+ ClassWithArray theClass = mocker.ClassUnderTest;
+
+ theClass.Services.Length.ShouldEqual(3);
+ }
+
+ [Test]
+ public void CanInjectAnArrayOfMockServices4()
+ {
+ var mocker = new RhinoAutoMocker<ClassWithArray>();
+
+ mocker.PartialMockTheClassUnderTest();
+ ClassWithArray theClass = mocker.ClassUnderTest;
+
+ theClass.Services.Length.ShouldEqual(0);
+ }
+
+
+
+ [Test]
public void AutoFillAConcreteClassWithMocks()
{
IMockedService service = _container.GetInstance<IMockedService>();
Modified: trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs
===================================================================
--- trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs 2008-09-17 14:09:19 UTC (rev 153)
+++ trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs 2008-09-24 21:47:17 UTC (rev 154)
@@ -223,7 +223,7 @@
container.GetInstance<ClassWithDependency>().Rule.ShouldBeOfType(typeof(ColorRule));
}
- private static Logger createLogger(BuildSession session)
+ private static Logger createLogger(IContext session)
{
return new Logger(session.ParentType);
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|