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