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