From: <jer...@us...> - 2009-12-03 20:55:01
|
Revision: 275 http://structuremap.svn.sourceforge.net/structuremap/?rev=275&view=rev Author: jeremydmiller Date: 2009-12-03 20:54:50 +0000 (Thu, 03 Dec 2009) Log Message: ----------- convenience method on ChildInstance. Other convenience stuff for Dovetail Modified Paths: -------------- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs trunk/Source/StructureMap/Configuration/DSL/Registry.cs trunk/Source/StructureMap/Container.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs trunk/Source/StructureMap/StructureMap.csproj trunk/Source/StructureMap/StructureMapException.resx trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/InjectArrayTester.cs trunk/Source/StructureMap.Testing/PerRequestInterceptorTester.cs trunk/Source/StructureMap.Testing/Pipeline/BuildStrategiesTester.cs trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj Added Paths: ----------- trunk/Source/StructureMap/Example.cs trunk/Source/StructureMap.Testing/Bugs/SpecifyScopeOnOpenGenericsTester.cs Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2009-11-13 17:33:27 UTC (rev 274) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2009-12-03 20:54:50 UTC (rev 275) @@ -109,7 +109,13 @@ /// <returns></returns> public SmartInstance<CONCRETETYPE> Use<CONCRETETYPE>() where CONCRETETYPE : PLUGINTYPE { - return TheDefault.Is.OfConcreteType<CONCRETETYPE>(); + // This is *my* team's naming convention for generic parameters + // I know you may not like it, but it's my article so there + var instance = new SmartInstance<CONCRETETYPE>(); + + registerDefault(instance); + + return instance; } /// <summary> @@ -147,13 +153,37 @@ /// Convenience method to mark a PluginFamily as a Singleton /// </summary> /// <returns></returns> - public CreatePluginFamilyExpression<PLUGINTYPE> AsSingletons() + public CreatePluginFamilyExpression<PLUGINTYPE> Singleton() { - _alterations.Add(family => family.SetScopeTo(InstanceScope.Singleton)); + return lifecycleIs(InstanceScope.Singleton); + } + + private CreatePluginFamilyExpression<PLUGINTYPE> lifecycleIs(InstanceScope lifecycle) + { + _alterations.Add(family => family.SetScopeTo(lifecycle)); return this; } /// <summary> + /// Convenience method to mark a PluginFamily as a Hybrid lifecycle + /// </summary> + /// <returns></returns> + public CreatePluginFamilyExpression<PLUGINTYPE> HybridHttpOrThreadLocalScoped() + { + return lifecycleIs(InstanceScope.Hybrid); + } + + /// <summary> + /// Convenience method to mark a PluginFamily as HttpContext scoped + /// </summary> + /// <returns></returns> + public CreatePluginFamilyExpression<PLUGINTYPE> HttpContextScoped() + { + return lifecycleIs(InstanceScope.HttpContext); + } + + + /// <summary> /// Register an Action to run against any object of this PluginType immediately after /// it is created, but before the new object is passed back to the caller /// </summary> Modified: trunk/Source/StructureMap/Configuration/DSL/Registry.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2009-11-13 17:33:27 UTC (rev 274) +++ trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2009-12-03 20:54:50 UTC (rev 275) @@ -169,7 +169,7 @@ /// <returns></returns> public CreatePluginFamilyExpression<PLUGINTYPE> ForSingletonOf<PLUGINTYPE>() { - return ForRequestedType<PLUGINTYPE>().AsSingletons(); + return ForRequestedType<PLUGINTYPE>().Singleton(); } /// <summary> @@ -412,7 +412,7 @@ /// <returns></returns> public CreatePluginFamilyExpression<PLUGINTYPE> For<PLUGINTYPE>() { - return ForRequestedType<PLUGINTYPE>(); + return new CreatePluginFamilyExpression<PLUGINTYPE>(this); } /// <summary> Modified: trunk/Source/StructureMap/Container.cs =================================================================== --- trunk/Source/StructureMap/Container.cs 2009-11-13 17:33:27 UTC (rev 274) +++ trunk/Source/StructureMap/Container.cs 2009-12-03 20:54:50 UTC (rev 275) @@ -23,7 +23,15 @@ var expression = new ConfigurationExpression(); action(expression); - construct(expression.BuildGraph()); + // As explained later in the article, + // PluginGraph is part of the Semantic Model + // of StructureMap + PluginGraph graph = expression.BuildGraph(); + + // Take the PluginGraph object graph and + // dynamically emit classes to build the + // configured objects + construct(graph); } public Container(Registry registry) Added: trunk/Source/StructureMap/Example.cs =================================================================== --- trunk/Source/StructureMap/Example.cs (rev 0) +++ trunk/Source/StructureMap/Example.cs 2009-12-03 20:54:50 UTC (rev 275) @@ -0,0 +1,101 @@ +using System; + +namespace StructureMap +{ + public interface IMessageSender + { + void SendMessage(string text, string sender, string receiver); + } + + public class FluentMessageSender + { + private readonly IMessageSender _messageSender; + + public FluentMessageSender(IMessageSender sender) + { + _messageSender = sender; + } + + public SendExpression SendText(string text) + { + return new SendExpression(text, _messageSender); + } + + public class SendExpression : ToExpression + { + private readonly string _text; + private readonly IMessageSender _messageSender; + private string _sender; + + public SendExpression(string text, IMessageSender messageSender) + { + _text = text; + _messageSender = messageSender; + } + + public ToExpression From(string sender) + { + _sender = sender; + return this; + } + + void ToExpression.To(string receiver) + { + _messageSender.SendMessage(_text, _sender, receiver); + } + } + + public interface ToExpression + { + void To(string receiver); + } + } + + public class SendMessageRequest + { + public string Text { get; set; } + public string Sender { get; set; } + public string Receiver { get; set; } + } + + public class ParameterObjectMessageSender + { + public void Send(SendMessageRequest request) + { + // send the message + } + } + + public class APIConsumer + { + // Snippet from a class that uses IMessageSender + public void SendMessage(IMessageSender sender) + { + // Is this right? + sender.SendMessage("the message body", "PARTNER001", "PARTNER002"); + + // or this? + sender.SendMessage("PARTNER001", "the message body", "PARTNER002"); + + // or this? + sender.SendMessage("PARTNER001", "PARTNER002", "the message body"); + } + + public void SendMessageFluently(FluentMessageSender sender) + { + sender + .SendText("the message body") + .From("PARTNER001").To("PARTNER002"); + } + + public void SendMessageAsParameter(ParameterObjectMessageSender sender) + { + sender.Send(new SendMessageRequest() + { + Text = "the message body", + Receiver = "PARTNER001", + Sender = "PARTNER002" + }); + } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs 2009-11-13 17:33:27 UTC (rev 274) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs 2009-12-03 20:54:50 UTC (rev 275) @@ -116,14 +116,27 @@ /// <returns></returns> public ChildInstanceExpression Child<CONSTRUCTORARGUMENTTYPE>() { - string propertyName = findPropertyName<CONSTRUCTORARGUMENTTYPE>(); + Type dependencyType = typeof(CONSTRUCTORARGUMENTTYPE); + return Child(dependencyType); + } + + /// <summary> + /// Start the definition of a child instance for type CONSTRUCTORARGUMENTTYPE + /// </summary> + /// <typeparam name="CONSTRUCTORARGUMENTTYPE"></typeparam> + /// <returns></returns> + public ChildInstanceExpression Child(Type dependencyType) + { + string propertyName = findPropertyName(dependencyType); + ChildInstanceExpression child = Child(propertyName); - child.ChildType = typeof (CONSTRUCTORARGUMENTTYPE); + child.ChildType = dependencyType; return child; } + /// <summary> /// Inline definition of a constructor or a setter property dependency /// </summary> Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs 2009-11-13 17:33:27 UTC (rev 274) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs 2009-12-03 20:54:50 UTC (rev 275) @@ -226,12 +226,19 @@ protected string findPropertyName<PLUGINTYPE>() { + Type dependencyType = typeof(PLUGINTYPE); + + return findPropertyName(dependencyType); + } + + protected string findPropertyName(Type dependencyType) + { var plugin = new Plugin(_pluggedType); - string propertyName = plugin.FindArgumentNameForType<T>(); + string propertyName = plugin.FindArgumentNameForType(dependencyType); if (string.IsNullOrEmpty(propertyName)) { - throw new StructureMapException(305, typeof(PLUGINTYPE)); + throw new StructureMapException(305, dependencyType); } return propertyName; Modified: trunk/Source/StructureMap/StructureMap.csproj =================================================================== --- trunk/Source/StructureMap/StructureMap.csproj 2009-11-13 17:33:27 UTC (rev 274) +++ trunk/Source/StructureMap/StructureMap.csproj 2009-12-03 20:54:50 UTC (rev 275) @@ -390,6 +390,7 @@ <Compile Include="Emitting\BuildUpMethod.cs" /> <Compile Include="Emitting\Parameters\Methods.cs" /> <Compile Include="ErrorMessages.cs" /> + <Compile Include="Example.cs" /> <Compile Include="Extensions.cs" /> <Compile Include="Graph\FamilyAttributeScanner.cs" /> <Compile Include="Graph\FindAllTypesFilter.cs" /> Modified: trunk/Source/StructureMap/StructureMapException.resx =================================================================== --- trunk/Source/StructureMap/StructureMapException.resx 2009-11-13 17:33:27 UTC (rev 274) +++ trunk/Source/StructureMap/StructureMapException.resx 2009-12-03 20:54:50 UTC (rev 275) @@ -277,4 +277,7 @@ <data name="245" xml:space="preserve"> <value>Error while trying to create an InstanceBuilder for {0}</value> </data> + <data name="25" xml:space="preserve"> + <value>Only a concrete type may be used here</value> + </data> </root> \ No newline at end of file Added: trunk/Source/StructureMap.Testing/Bugs/SpecifyScopeOnOpenGenericsTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Bugs/SpecifyScopeOnOpenGenericsTester.cs (rev 0) +++ trunk/Source/StructureMap.Testing/Bugs/SpecifyScopeOnOpenGenericsTester.cs 2009-12-03 20:54:50 UTC (rev 275) @@ -0,0 +1,27 @@ +using NUnit.Framework; +using StructureMap.Attributes; + +namespace StructureMap.Testing.Bugs +{ + [TestFixture] + public class SpecifyScopeOnOpenGenericsTester + { + + [Test] + public void should_obey_scope_set_on_open_type() + { + var container = new Container(x => + { + x.For(typeof (IOpenType<>)).CacheBy(InstanceScope.Singleton).Use(typeof (OpenType<>)); + }); + + var o1 = container.GetInstance<IOpenType<string>>(); + var o2 = container.GetInstance<IOpenType<string>>(); + + o1.ShouldBeTheSameAs(o2); + } + } + + public interface IOpenType<T>{} + public class OpenType<T> : IOpenType<T>{} +} \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs 2009-11-13 17:33:27 UTC (rev 274) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/CreatePluginFamilyTester.cs 2009-12-03 20:54:50 UTC (rev 275) @@ -145,7 +145,7 @@ { var registry = new Registry(); CreatePluginFamilyExpression<IGateway> expression = - registry.BuildInstancesOf<IGateway>().AsSingletons(); + registry.BuildInstancesOf<IGateway>().Singleton(); Assert.IsNotNull(expression); PluginGraph pluginGraph = registry.Build(); Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/InjectArrayTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/InjectArrayTester.cs 2009-11-13 17:33:27 UTC (rev 274) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/InjectArrayTester.cs 2009-12-03 20:54:50 UTC (rev 275) @@ -200,7 +200,7 @@ { IContainer container = new Container(r => { - r.ForRequestedType<Processor>().TheDefault.Is.OfConcreteType<Processor>() + r.For<Processor>().Use<Processor>() .WithCtorArg("name").EqualTo("Jeremy") .TheArrayOf<IHandler>().Contains(x => { Modified: trunk/Source/StructureMap.Testing/PerRequestInterceptorTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/PerRequestInterceptorTester.cs 2009-11-13 17:33:27 UTC (rev 274) +++ trunk/Source/StructureMap.Testing/PerRequestInterceptorTester.cs 2009-12-03 20:54:50 UTC (rev 275) @@ -59,17 +59,17 @@ ObjectFactory.Initialize( x => { - x.BuildInstancesOf<Session>() + x.ForRequestedType<Session>() .AlwaysUnique() .TheDefaultIsConcreteType<Session>(); - x.BuildInstancesOf<Model1>() + x.ForRequestedType<Model1>() .TheDefaultIsConcreteType<Model1>(); - x.BuildInstancesOf<Model2>() + x.ForRequestedType<Model2>() .TheDefaultIsConcreteType<Model2>(); - x.BuildInstancesOf<Shell>() + x.ForRequestedType<Shell>() .TheDefaultIsConcreteType<Shell>(); }); Modified: trunk/Source/StructureMap.Testing/Pipeline/BuildStrategiesTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/BuildStrategiesTester.cs 2009-11-13 17:33:27 UTC (rev 274) +++ trunk/Source/StructureMap.Testing/Pipeline/BuildStrategiesTester.cs 2009-12-03 20:54:50 UTC (rev 275) @@ -46,7 +46,7 @@ { var container = new Container(x => { - x.ForRequestedType<IService>().AsSingletons().AddInstances(o => + x.ForRequestedType<IService>().Singleton().AddInstances(o => { o.Is.ConstructedBy(() => new ColorService("Red")).WithName("Red"); o.Is.ConstructedBy(() => new ColorService("Green")).WithName("Green"); Modified: trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs 2009-11-13 17:33:27 UTC (rev 274) +++ trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs 2009-12-03 20:54:50 UTC (rev 275) @@ -4,6 +4,7 @@ using StructureMap.Configuration.DSL; using StructureMap.Graph; using StructureMap.Pipeline; +using StructureMap.Testing.Configuration.DSL; using StructureMap.Testing.GenericWidgets; using StructureMap.Testing.Widget; using StructureMap.Testing.Widget2; @@ -63,7 +64,6 @@ var instance = new ConfiguredInstance(GetType()); - using (mocks.Record()) { Expect.Call(builder.BuildInstance(instance, session)).Return(theObjectBuilt); @@ -277,5 +277,20 @@ instance.Build(GetType(), new StubBuildSession(), builder); }); } + + [Test] + public void use_the_child_function() + { + var theRule = new ARule(); + + var container = new Container(x => + { + x.For(typeof (ClassWithDependency)).Use(typeof (ClassWithDependency)).Child(typeof (Rule)).Is(theRule); + }); + + container.GetInstance<ClassWithDependency>().Rule.ShouldBeTheSameAs(theRule); + } } + + } \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj =================================================================== --- trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-11-13 17:33:27 UTC (rev 274) +++ trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-12-03 20:54:50 UTC (rev 275) @@ -187,6 +187,7 @@ <Compile Include="Bugs\ScanIndexerBugTester.cs" /> <Compile Include="Bugs\SingletonShouldBeLazy.cs" /> <Compile Include="Bugs\SpecifyScopeInConfigureTester.cs" /> + <Compile Include="Bugs\SpecifyScopeOnOpenGenericsTester.cs" /> <Compile Include="Bugs\StaticPropertyCausesJITExceptionTester.cs" /> <Compile Include="BuildSessionTester.cs" /> <Compile Include="BuildUpIntegratedTester.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |