|
From: <jer...@us...> - 2008-08-07 21:52:23
|
Revision: 130
http://structuremap.svn.sourceforge.net/structuremap/?rev=130&view=rev
Author: jeremydmiller
Date: 2008-08-07 21:52:19 +0000 (Thu, 07 Aug 2008)
Log Message:
-----------
enhancing the explicit argument passing
Modified Paths:
--------------
trunk/Source/StructureMap/BuildSession.cs
trunk/Source/StructureMap/Container.cs
trunk/Source/StructureMap/ExplicitArgsExpression.cs
trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs
trunk/Source/StructureMap/Pipeline/IBuildSession.cs
trunk/Source/StructureMap/PipelineGraph.cs
trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs
trunk/Source/StructureMap.Testing/Pipeline/StubBuildSession.cs
trunk/Source/StructureMap.Testing/SpecificationExtensions.cs
Added Paths:
-----------
trunk/Source/Backup/
trunk/Source/Backup/ExplicitArguments.htm
trunk/Source/Backup/HTML.csproj
Added: trunk/Source/Backup/ExplicitArguments.htm
===================================================================
--- trunk/Source/Backup/ExplicitArguments.htm (rev 0)
+++ trunk/Source/Backup/ExplicitArguments.htm 2008-08-07 21:52:19 UTC (rev 130)
@@ -0,0 +1,19 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+ <head>
+ <title></title>
+ </head>
+ <body>
+ <h1>
+ Explicit Arguments</h1>
+ <p>
+ A new feature in StructureMap 2.5 is the ability to pass in arguments to ObjectFactory.</p>
+ <p>
+ </p>
+ <h4>
+ Primitive Value</h4>
+ <p>
+ </p>
+
+ </body>
+</html>
\ No newline at end of file
Added: trunk/Source/Backup/HTML.csproj
===================================================================
--- trunk/Source/Backup/HTML.csproj (rev 0)
+++ trunk/Source/Backup/HTML.csproj 2008-08-07 21:52:19 UTC (rev 130)
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>8.0.50727</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{A6358895-641F-4CC2-BE8E-C61EBE1DBEB9}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>HTML</RootNamespace>
+ <AssemblyName>HTML</AssemblyName>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+ Other similar extension points exist, see Microsoft.Common.targets.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target>
+ -->
+ <ItemGroup>
+ <Content Include="ExplicitArguments.htm" />
+ </ItemGroup>
+</Project>
\ No newline at end of file
Modified: trunk/Source/StructureMap/BuildSession.cs
===================================================================
--- trunk/Source/StructureMap/BuildSession.cs 2008-08-07 20:23:07 UTC (rev 129)
+++ trunk/Source/StructureMap/BuildSession.cs 2008-08-07 21:52:19 UTC (rev 130)
@@ -4,6 +4,7 @@
using StructureMap.Graph;
using StructureMap.Interceptors;
using StructureMap.Pipeline;
+using StructureMap.Util;
namespace StructureMap
{
@@ -12,11 +13,24 @@
private readonly InterceptorLibrary _interceptorLibrary;
private readonly PipelineGraph _pipelineGraph;
private readonly InstanceCache _cache = new InstanceCache();
+ private readonly Cache<Type, object> _defaults;
public BuildSession(PipelineGraph pipelineGraph, InterceptorLibrary interceptorLibrary)
{
_pipelineGraph = pipelineGraph;
_interceptorLibrary = interceptorLibrary;
+
+ _defaults = new Cache<Type, object>(t =>
+ {
+ Instance instance = _pipelineGraph.GetDefault(t);
+
+ if (instance == null)
+ {
+ throw new StructureMapException(202, t);
+ }
+
+ return CreateInstance(t, instance);
+ });
}
public BuildSession(PluginGraph graph)
@@ -87,14 +101,7 @@
public object CreateInstance(Type pluginType)
{
- Instance instance = _pipelineGraph.GetDefault(pluginType);
-
- if (instance == null)
- {
- throw new StructureMapException(202, pluginType.FullName);
- }
-
- return CreateInstance(pluginType, instance);
+ return _defaults.Retrieve(pluginType);
}
public object ApplyInterception(Type pluginType, object actualValue)
@@ -112,6 +119,11 @@
return forType(pluginType).FindBuilderByConcreteKey(concreteKey);
}
+ public void RegisterDefault(Type pluginType, object defaultObject)
+ {
+ _defaults.Store(pluginType, defaultObject);
+ }
+
#endregion
private IInstanceFactory forType(Type pluginType)
Modified: trunk/Source/StructureMap/Container.cs
===================================================================
--- trunk/Source/StructureMap/Container.cs 2008-08-07 20:23:07 UTC (rev 129)
+++ trunk/Source/StructureMap/Container.cs 2008-08-07 21:52:19 UTC (rev 130)
@@ -80,10 +80,7 @@
public PLUGINTYPE GetInstance<PLUGINTYPE>(ExplicitArguments args)
{
- Instance defaultInstance = _pipelineGraph.GetDefault(typeof (PLUGINTYPE));
-
- ExplicitInstance instance = new ExplicitInstance(typeof(PLUGINTYPE), args, defaultInstance);
- return GetInstance<PLUGINTYPE>(instance);
+ return (PLUGINTYPE) GetInstance(typeof(PLUGINTYPE), args);
}
public object GetInstance(Type type, ExplicitArguments args)
@@ -91,8 +88,11 @@
Instance defaultInstance = _pipelineGraph.GetDefault(type);
Instance instance = new ExplicitInstance(type, args, defaultInstance);
+ IBuildSession session = withNewSession();
- return GetInstance(type, instance);
+ args.RegisterDefaults(session);
+
+ return session.CreateInstance(type, instance);
}
public void Inject<PLUGINTYPE>(PLUGINTYPE instance)
Modified: trunk/Source/StructureMap/ExplicitArgsExpression.cs
===================================================================
--- trunk/Source/StructureMap/ExplicitArgsExpression.cs 2008-08-07 20:23:07 UTC (rev 129)
+++ trunk/Source/StructureMap/ExplicitArgsExpression.cs 2008-08-07 21:52:19 UTC (rev 130)
@@ -11,12 +11,12 @@
public class ExplicitArgsExpression : IExplicitProperty
{
private readonly ExplicitArguments _args = new ExplicitArguments();
- private readonly IContainer _manager;
+ private readonly IContainer _container;
private string _lastArgName;
internal ExplicitArgsExpression(IContainer manager)
{
- _manager = manager;
+ _container = manager;
}
#region IExplicitProperty Members
@@ -59,7 +59,7 @@
/// <returns></returns>
public T GetInstance<T>()
{
- return _manager.GetInstance<T>(_args);
+ return _container.GetInstance<T>(_args);
}
/// <summary>
@@ -69,7 +69,7 @@
/// <returns></returns>
public object GetInstance(Type type)
{
- return _manager.GetInstance(type, _args);
+ return _container.GetInstance(type, _args);
}
}
}
\ No newline at end of file
Modified: trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs
===================================================================
--- trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs 2008-08-07 20:23:07 UTC (rev 129)
+++ trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs 2008-08-07 21:52:19 UTC (rev 130)
@@ -62,6 +62,14 @@
{
return _args.ContainsKey(propertyName);
}
+
+ public void RegisterDefaults(IBuildSession session)
+ {
+ foreach (var pair in _children)
+ {
+ session.RegisterDefault(pair.Key, pair.Value);
+ }
+ }
}
public class ExplicitInstance : ConfiguredInstance
Modified: trunk/Source/StructureMap/Pipeline/IBuildSession.cs
===================================================================
--- trunk/Source/StructureMap/Pipeline/IBuildSession.cs 2008-08-07 20:23:07 UTC (rev 129)
+++ trunk/Source/StructureMap/Pipeline/IBuildSession.cs 2008-08-07 21:52:19 UTC (rev 130)
@@ -11,5 +11,6 @@
object ApplyInterception(Type pluginType, object actualValue);
InstanceBuilder FindBuilderByType(Type pluginType, Type pluggedType);
InstanceBuilder FindBuilderByConcreteKey(Type pluginType, string concreteKey);
+ void RegisterDefault(Type pluginType, object defaultObject);
}
}
\ No newline at end of file
Modified: trunk/Source/StructureMap/PipelineGraph.cs
===================================================================
--- trunk/Source/StructureMap/PipelineGraph.cs 2008-08-07 20:23:07 UTC (rev 129)
+++ trunk/Source/StructureMap/PipelineGraph.cs 2008-08-07 21:52:19 UTC (rev 130)
@@ -155,7 +155,7 @@
return InstanceFactory.CreateFactoryForType(pluggedType, _profileManager);
}
- public Instance GetDefault(Type pluginType)
+ public virtual Instance GetDefault(Type pluginType)
{
// Need to ensure that the factory exists first
createFactoryIfMissing(pluginType);
Modified: trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs
===================================================================
--- trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs 2008-08-07 20:23:07 UTC (rev 129)
+++ trunk/Source/StructureMap.Testing/Graph/ExplicitArgumentTester.cs 2008-08-07 21:52:19 UTC (rev 130)
@@ -74,13 +74,31 @@
}
[Test]
+ public void Explicit_services_are_used_throughout_the_object_graph()
+ {
+ var theTrade = new Trade();
+
+ IContainer container = new Container(r =>
+ {
+ r.ForRequestedType<IView>().TheDefaultIsConcreteType<TradeView>();
+ r.ForRequestedType<Node>().TheDefaultIsConcreteType<TradeNode>();
+ });
+
+ Command command = container.With<Trade>(theTrade).GetInstance<Command>();
+
+ command.Trade.ShouldBeTheSameAs(theTrade);
+ command.Node.IsType<TradeNode>().Trade.ShouldBeTheSameAs(theTrade);
+ command.View.IsType<TradeView>().Trade.ShouldBeTheSameAs(theTrade);
+ }
+
+ [Test]
public void ExplicitArguments_can_return_child_by_name()
{
- ExplicitArguments args = new ExplicitArguments();
- Node theNode = new Node();
+ var args = new ExplicitArguments();
+ var theNode = new Node();
args.SetArg("node", theNode);
- IConfiguredInstance instance = new ExplicitInstance(typeof(Command), args, null);
+ IConfiguredInstance instance = new ExplicitInstance(typeof (Command), args, null);
Assert.AreSame(theNode, instance.GetChild("node", typeof (Node), new StubBuildSession()));
}
@@ -88,13 +106,13 @@
[Test]
public void Fill_in_argument_by_name()
{
- Container container = new Container();
+ var container = new Container();
container.SetDefault<IView, View>();
- Node theNode = new Node();
- Trade theTrade = new Trade();
+ var theNode = new Node();
+ var theTrade = new Trade();
- Command command = container
+ var command = container
.With("node").EqualTo(theNode)
.With(theTrade)
.GetInstance<Command>();
@@ -117,12 +135,12 @@
ObjectFactory.Reset();
// Get the ExplicitTarget without setting an explicit arg for IProvider
- ExplicitTarget firstTarget = ObjectFactory.GetInstance<ExplicitTarget>();
+ var firstTarget = ObjectFactory.GetInstance<ExplicitTarget>();
Assert.IsInstanceOfType(typeof (RedProvider), firstTarget.Provider);
// Now, set the explicit arg for IProvider
- BlueProvider theBlueProvider = new BlueProvider();
- ExplicitTarget secondTarget = ObjectFactory.With<IProvider>(theBlueProvider).GetInstance<ExplicitTarget>();
+ var theBlueProvider = new BlueProvider();
+ var secondTarget = ObjectFactory.With<IProvider>(theBlueProvider).GetInstance<ExplicitTarget>();
Assert.AreSame(theBlueProvider, secondTarget.Provider);
}
@@ -139,28 +157,28 @@
ObjectFactory.Reset();
// Get the ExplicitTarget without setting an explicit arg for IProvider
- ExplicitTarget firstTarget = ObjectFactory.GetInstance<ExplicitTarget>();
+ var firstTarget = ObjectFactory.GetInstance<ExplicitTarget>();
Assert.AreEqual("Jeremy", firstTarget.Name);
// Now, set the explicit arg for IProvider
- ExplicitTarget secondTarget = ObjectFactory.With("name").EqualTo("Julia").GetInstance<ExplicitTarget>();
+ var secondTarget = ObjectFactory.With("name").EqualTo("Julia").GetInstance<ExplicitTarget>();
Assert.AreEqual("Julia", secondTarget.Name);
}
[Test]
public void Pass_in_arguments_as_dictionary()
{
- Container manager = new Container();
+ var manager = new Container();
manager.SetDefault<IView, View>();
- Node theNode = new Node();
- Trade theTrade = new Trade();
+ var theNode = new Node();
+ var theTrade = new Trade();
- ExplicitArguments args = new ExplicitArguments();
+ var args = new ExplicitArguments();
args.Set(theNode);
args.SetArg("trade", theTrade);
- Command command = manager.GetInstance<Command>(args);
+ var command = manager.GetInstance<Command>(args);
Assert.IsInstanceOfType(typeof (View), command.View);
Assert.AreSame(theNode, command.Node);
@@ -175,11 +193,11 @@
new Container(
registry => registry.ForRequestedType<IProvider>().TheDefaultIsConcreteType<LumpProvider>());
- ExplicitArguments args = new ExplicitArguments();
- Lump theLump = new Lump();
+ var args = new ExplicitArguments();
+ var theLump = new Lump();
args.Set(theLump);
- LumpProvider instance = (LumpProvider) manager.GetInstance<IProvider>(args);
+ var instance = (LumpProvider) manager.GetInstance<IProvider>(args);
Assert.AreSame(theLump, instance.Lump);
}
@@ -188,17 +206,17 @@
{
StructureMapConfiguration.ForRequestedType<IProvider>().TheDefaultIsConcreteType<LumpProvider>();
ObjectFactory.Reset();
- Lump theLump = new Lump();
+ var theLump = new Lump();
- LumpProvider provider = (LumpProvider) ObjectFactory.With(theLump).GetInstance<IProvider>();
+ var provider = (LumpProvider) ObjectFactory.With(theLump).GetInstance<IProvider>();
Assert.AreSame(theLump, provider.Lump);
}
[Test]
public void PassAnArgumentIntoExplicitArgumentsThatMightNotAlreadyBeRegistered()
{
- Lump theLump = new Lump();
- LumpProvider provider = ObjectFactory.With(theLump).GetInstance<LumpProvider>();
+ var theLump = new Lump();
+ var provider = ObjectFactory.With(theLump).GetInstance<LumpProvider>();
Assert.AreSame(theLump, provider.Lump);
}
@@ -212,25 +230,25 @@
.WithProperty("name").EqualTo("Jeremy")
));
- ExplicitArguments args = new ExplicitArguments();
+ var args = new ExplicitArguments();
// Get the ExplicitTarget without setting an explicit arg for IProvider
- ExplicitTarget firstTarget = manager.GetInstance<ExplicitTarget>(args);
+ var firstTarget = manager.GetInstance<ExplicitTarget>(args);
Assert.IsInstanceOfType(typeof (RedProvider), firstTarget.Provider);
// Now, set the explicit arg for IProvider
args.Set<IProvider>(new BlueProvider());
- ExplicitTarget secondTarget = manager.GetInstance<ExplicitTarget>(args);
+ var secondTarget = manager.GetInstance<ExplicitTarget>(args);
Assert.IsInstanceOfType(typeof (BlueProvider), secondTarget.Provider);
}
[Test]
public void RegisterAndFindServicesOnTheExplicitArgument()
{
- ExplicitArguments args = new ExplicitArguments();
+ var args = new ExplicitArguments();
Assert.IsNull(args.Get<IProvider>());
- RedProvider red = new RedProvider();
+ var red = new RedProvider();
args.Set<IProvider>(red);
Assert.AreSame(red, args.Get<IProvider>());
@@ -242,7 +260,7 @@
[Test]
public void RegisterAndRetrieveArgs()
{
- ExplicitArguments args = new ExplicitArguments();
+ var args = new ExplicitArguments();
Assert.IsNull(args.GetArg("name"));
args.SetArg("name", "Jeremy");
@@ -278,6 +296,21 @@
{
}
+ public class TradeView : IView
+ {
+ private readonly Trade _trade;
+
+ public TradeView(Trade trade)
+ {
+ _trade = trade;
+ }
+
+ public Trade Trade
+ {
+ get { return _trade; }
+ }
+ }
+
public class Node
{
}
@@ -318,4 +351,19 @@
get { return _view; }
}
}
+
+ public class TradeNode : Node
+ {
+ private readonly Trade _trade;
+
+ public TradeNode(Trade trade)
+ {
+ _trade = trade;
+ }
+
+ public Trade Trade
+ {
+ get { return _trade; }
+ }
+ }
}
\ No newline at end of file
Modified: trunk/Source/StructureMap.Testing/Pipeline/StubBuildSession.cs
===================================================================
--- trunk/Source/StructureMap.Testing/Pipeline/StubBuildSession.cs 2008-08-07 20:23:07 UTC (rev 129)
+++ trunk/Source/StructureMap.Testing/Pipeline/StubBuildSession.cs 2008-08-07 21:52:19 UTC (rev 130)
@@ -49,6 +49,11 @@
throw new NotImplementedException();
}
+ public void RegisterDefault(Type pluginType, object defaultObject)
+ {
+
+ }
+
#endregion
public object CreateInstance(string typeName, IConfiguredInstance instance)
Modified: trunk/Source/StructureMap.Testing/SpecificationExtensions.cs
===================================================================
--- trunk/Source/StructureMap.Testing/SpecificationExtensions.cs 2008-08-07 20:23:07 UTC (rev 129)
+++ trunk/Source/StructureMap.Testing/SpecificationExtensions.cs 2008-08-07 21:52:19 UTC (rev 130)
@@ -46,6 +46,12 @@
return expected;
}
+ public static T IsType<T>(this object actual)
+ {
+ actual.ShouldBeOfType(typeof(T));
+ return (T) actual;
+ }
+
public static object ShouldNotBeTheSameAs(this object actual, object expected)
{
Assert.AreNotSame(expected, actual);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|