You can subscribe to this list here.
2006 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
(1) |
Oct
|
Nov
|
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2007 |
Jan
|
Feb
(5) |
Mar
(9) |
Apr
(9) |
May
(4) |
Jun
|
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(3) |
2008 |
Jan
(11) |
Feb
(6) |
Mar
|
Apr
(16) |
May
(28) |
Jun
(13) |
Jul
(3) |
Aug
(19) |
Sep
(11) |
Oct
(37) |
Nov
(1) |
Dec
(17) |
2009 |
Jan
(16) |
Feb
(6) |
Mar
|
Apr
(6) |
May
(1) |
Jun
(10) |
Jul
(4) |
Aug
(4) |
Sep
(4) |
Oct
(8) |
Nov
(3) |
Dec
(45) |
2010 |
Jan
(8) |
Feb
(21) |
Mar
(2) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2016 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(1) |
Sep
(1) |
Oct
|
Nov
|
Dec
|
From: <jer...@us...> - 2009-12-26 18:39:48
|
Revision: 300 http://structuremap.svn.sourceforge.net/structuremap/?rev=300&view=rev Author: jeremydmiller Date: 2009-12-26 18:39:40 +0000 (Sat, 26 Dec 2009) Log Message: ----------- code cleanup Modified Paths: -------------- trunk/Source/StructureMap/Configuration/ConfigurationParser.cs trunk/Source/StructureMap/Configuration/ConfigurationParserBuilder.cs trunk/Source/StructureMap/Configuration/DictionaryReader.cs trunk/Source/StructureMap/Configuration/FamilyParser.cs trunk/Source/StructureMap/Configuration/PrimitiveArrayReader.cs trunk/Source/StructureMap/Configuration/XmlExtensions.cs trunk/Source/StructureMap/Construction/BuilderCompiler.cs trunk/Source/StructureMap/Construction/ConstructorFunctionBuilder.cs trunk/Source/StructureMap/Construction/SetterBuilder.cs trunk/Source/StructureMap/Diagnostics/BuildError.cs trunk/Source/StructureMap/Diagnostics/CharacterWidth.cs trunk/Source/StructureMap/Diagnostics/DoctorRunner.cs trunk/Source/StructureMap/Diagnostics/Error.cs trunk/Source/StructureMap/Diagnostics/ValidationBuildSession.cs trunk/Source/StructureMap/Diagnostics/ValidationError.cs trunk/Source/StructureMap/Diagnostics/WhatDoIHaveWriter.cs trunk/Source/StructureMap/Example.cs trunk/Source/StructureMap/Exceptions/InstancePropertyValueException.cs trunk/Source/StructureMap/Exceptions/MissingPluginFamilyException.cs trunk/Source/StructureMap/Exceptions/StructureMapConfigurationException.cs trunk/Source/StructureMap/Graph/AssemblyScanner.cs trunk/Source/StructureMap/Graph/ImplementationMap.cs trunk/Source/StructureMap/Graph/PluginFamilyCollection.cs trunk/Source/StructureMap/Graph/PluginGraph.cs trunk/Source/StructureMap/Interceptors/CompoundInterceptor.cs trunk/Source/StructureMap/Interceptors/Interceptors.cs trunk/Source/StructureMap/Interceptors/MatchedTypeInterceptor.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs trunk/Source/StructureMap/Pipeline/HttpContextLifecycle.cs trunk/Source/StructureMap/Pipeline/HybridSessionLifecycle.cs trunk/Source/StructureMap/Pipeline/InstanceKey.cs trunk/Source/StructureMap/Pipeline/Lifecycles.cs trunk/Source/StructureMap/Pipeline/MainObjectCache.cs trunk/Source/StructureMap/Pipeline/SessionWrapper.cs trunk/Source/StructureMap/Pipeline/UniquePerRequestLifecycle.cs trunk/Source/StructureMap/Pipeline/UserControlInstance.cs trunk/Source/StructureMap/Source/BasicXmlMementoSource.cs trunk/Source/StructureMap/Source/MemoryMementoSource.cs trunk/Source/StructureMap/SystemRegistry.cs trunk/Source/StructureMap/TypeExtensions.cs Modified: trunk/Source/StructureMap/Configuration/ConfigurationParser.cs =================================================================== --- trunk/Source/StructureMap/Configuration/ConfigurationParser.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Configuration/ConfigurationParser.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -62,16 +62,12 @@ } - public string FilePath - { - get { return _filePath; } - set { _filePath = value; } - } + public string FilePath { get { return _filePath; } set { _filePath = value; } } public void ForEachFile(GraphLog log, Action<string> action) { string includePath = getIncludePath(); - + // Find the text in every child node of _structureMapNode and // perform an action with that text _structureMapNode.ForTextInChild("Include/@File").Do(fileName => Modified: trunk/Source/StructureMap/Configuration/ConfigurationParserBuilder.cs =================================================================== --- trunk/Source/StructureMap/Configuration/ConfigurationParserBuilder.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Configuration/ConfigurationParserBuilder.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -17,6 +17,11 @@ public class ConfigurationParserBuilder : IConfigurationParserBuilder { + /// <summary> + /// The name of the default configuration file. The value is always <c>StructurMap.config</c> + /// </summary> + public static readonly string DefaultConfigurationFilename = "StructureMap.config"; + private readonly GraphLog _log; private readonly List<string> _otherFiles = new List<string>(); private readonly List<ConfigurationParser> _parsers = new List<ConfigurationParser>(); @@ -32,24 +37,12 @@ #region IConfigurationParserBuilder Members - public bool UseAndEnforceExistenceOfDefaultFile - { - get { return _useAndEnforceExistenceOfDefaultFile; } - set { _useAndEnforceExistenceOfDefaultFile = value; } - } + public bool UseAndEnforceExistenceOfDefaultFile { get { return _useAndEnforceExistenceOfDefaultFile; } set { _useAndEnforceExistenceOfDefaultFile = value; } } - public bool IgnoreDefaultFile - { - get { return _ignoreDefaultFile; } - set { _ignoreDefaultFile = value; } - } + public bool IgnoreDefaultFile { get { return _ignoreDefaultFile; } set { _ignoreDefaultFile = value; } } - public bool PullConfigurationFromAppConfig - { - get { return _pullConfigurationFromAppConfig; } - set { _pullConfigurationFromAppConfig = value; } - } + public bool PullConfigurationFromAppConfig { get { return _pullConfigurationFromAppConfig; } set { _pullConfigurationFromAppConfig = value; } } public void IncludeFile(string filename) { @@ -91,7 +84,7 @@ ConfigurationParser childParser = ConfigurationParser.FromFile(filename); list.Add(childParser); }) - .AndReportErrorAs(150, filename)); + .AndReportErrorAs(150, filename)); } } @@ -114,7 +107,7 @@ { foreach (string filename in _otherFiles) { - var absolutePath = locateFileAsAbsolutePath(filename); + string absolutePath = locateFileAsAbsolutePath(filename); _log.Try(() => { ConfigurationParser parser = ConfigurationParser.FromFile(absolutePath); @@ -128,7 +121,7 @@ { if (_ignoreDefaultFile) return; // Pick up the configuration in the default StructureMap.config - var pathToStructureMapConfig = GetStructureMapConfigurationPath(); + string pathToStructureMapConfig = GetStructureMapConfigurationPath(); if ((_useAndEnforceExistenceOfDefaultFile || File.Exists(pathToStructureMapConfig))) { _log.Try(() => @@ -150,11 +143,6 @@ } /// <summary> - /// The name of the default configuration file. The value is always <c>StructurMap.config</c> - /// </summary> - public static readonly string DefaultConfigurationFilename = "StructureMap.config"; - - /// <summary> /// Returns the absolute path to the StructureMap.config file /// </summary> /// <returns></returns> @@ -166,8 +154,8 @@ private static string locateFileAsAbsolutePath(string filename) { if (Path.IsPathRooted(filename)) return filename; - var basePath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase; - var configPath = Path.Combine(basePath, filename); + string basePath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase; + string configPath = Path.Combine(basePath, filename); if (!File.Exists(configPath)) { Modified: trunk/Source/StructureMap/Configuration/DictionaryReader.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DictionaryReader.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Configuration/DictionaryReader.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -63,10 +63,7 @@ _dictionary.Add(key, theValue); } - public object Object - { - get { return _dictionary; } - } + public object Object { get { return _dictionary; } } #endregion } @@ -96,10 +93,7 @@ _collection.Add(name, value); } - public object Object - { - get { return _collection; } - } + public object Object { get { return _collection; } } #endregion } Modified: trunk/Source/StructureMap/Configuration/FamilyParser.cs =================================================================== --- trunk/Source/StructureMap/Configuration/FamilyParser.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Configuration/FamilyParser.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -121,7 +121,8 @@ private void attachInterceptors(PluginFamily family, XmlElement familyElement) { - string contextBase = string.Format("creating an InstanceInterceptor for {0}\n", family.PluginType.AssemblyQualifiedName); + string contextBase = string.Format("creating an InstanceInterceptor for {0}\n", + family.PluginType.AssemblyQualifiedName); familyElement.ForEachChild("*/Interceptor").Do(element => { var interceptorMemento = new XmlAttributeInstanceMemento(element); Modified: trunk/Source/StructureMap/Configuration/PrimitiveArrayReader.cs =================================================================== --- trunk/Source/StructureMap/Configuration/PrimitiveArrayReader.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Configuration/PrimitiveArrayReader.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -1,6 +1,5 @@ using System; using System.Xml; -using StructureMap.Graph; using StructureMap.Pipeline; using StructureMap.TypeRules; Modified: trunk/Source/StructureMap/Configuration/XmlExtensions.cs =================================================================== --- trunk/Source/StructureMap/Configuration/XmlExtensions.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Configuration/XmlExtensions.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -16,26 +16,6 @@ return new XmlTextExpression(node, xpath); } - public class XmlTextExpression - { - private readonly XmlNodeList _list; - - internal XmlTextExpression(XmlNode parent, string attributePath) - { - _list = parent.SelectNodes(attributePath); - } - - public void Do(Action<string> action) - { - if (_list == null) return; - - foreach (XmlNode node in _list) - { - action(node.InnerText); - } - } - } - public static XmlNodeExpression ForEachChild(this XmlNode node, string xpath) { return new XmlNodeExpression(node, xpath); @@ -113,8 +93,26 @@ #region Nested type: XmlTextExpression + public class XmlTextExpression + { + private readonly XmlNodeList _list; + internal XmlTextExpression(XmlNode parent, string attributePath) + { + _list = parent.SelectNodes(attributePath); + } + public void Do(Action<string> action) + { + if (_list == null) return; + + foreach (XmlNode node in _list) + { + action(node.InnerText); + } + } + } + #endregion } } \ No newline at end of file Modified: trunk/Source/StructureMap/Construction/BuilderCompiler.cs =================================================================== --- trunk/Source/StructureMap/Construction/BuilderCompiler.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Construction/BuilderCompiler.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -21,8 +21,8 @@ private static FuncCompiler getCompiler(Plugin plugin) { - var compilerType = typeof (FuncCompiler<>).MakeGenericType(plugin.PluggedType); - return (FuncCompiler)Activator.CreateInstance(compilerType); + Type compilerType = typeof (FuncCompiler<>).MakeGenericType(plugin.PluggedType); + return (FuncCompiler) Activator.CreateInstance(compilerType); } public static Action<IArguments, object> CompileBuildUp(Plugin plugin) @@ -32,6 +32,8 @@ return compiler.BuildUp(plugin); } + #region Nested type: FuncCompiler + public interface FuncCompiler { Func<IArguments, object> Compile(Plugin plugin); @@ -46,12 +48,12 @@ public InstanceBuilder CreateBuilder(Plugin plugin) { - var ctor = new ConstructorFunctionBuilder<T>().CreateBuilder(plugin); - var setters = this.buildUp(plugin); + Func<IArguments, T> ctor = new ConstructorFunctionBuilder<T>().CreateBuilder(plugin); + Action<IArguments, T> setters = buildUp(plugin); Func<IArguments, object> creator = args => { - var target = ctor(args); + T target = ctor(args); setters(args, target); return target; }; @@ -63,27 +65,33 @@ public Func<IArguments, object> Compile(Plugin plugin) { - var ctor = new ConstructorFunctionBuilder<T>().CreateBuilder(plugin); - var buildUp = this.buildUp(plugin); + Func<IArguments, T> ctor = new ConstructorFunctionBuilder<T>().CreateBuilder(plugin); + Action<IArguments, T> buildUp = this.buildUp(plugin); return args => { // Call the constructor - var target = ctor(args); + T target = ctor(args); buildUp(args, target); return target; }; } + public Action<IArguments, object> BuildUp(Plugin plugin) + { + Action<IArguments, T> func = buildUp(plugin); + return (args, raw) => func(args, (T) raw); + } + private Action<IArguments, T> buildUp(Plugin plugin) { - var mandatories = plugin.Setters.Where(x => x.IsMandatory) - .Select(x => _setterBuilder.BuildMandatorySetter((PropertyInfo)x.Property)) + Action<IArguments, T>[] mandatories = plugin.Setters.Where(x => x.IsMandatory) + .Select(x => _setterBuilder.BuildMandatorySetter((PropertyInfo) x.Property)) .ToArray(); - var optionals = plugin.Setters.Where(x => !x.IsMandatory) + Action<IArguments, T>[] optionals = plugin.Setters.Where(x => !x.IsMandatory) .Select(x => _setterBuilder.BuildOptionalSetter(x.Property)) .ToArray(); @@ -102,12 +110,8 @@ } }; } + } - public Action<IArguments, object> BuildUp(Plugin plugin) - { - var func = buildUp(plugin); - return (args, raw) => func(args, (T)raw); - } - } + #endregion } } \ No newline at end of file Modified: trunk/Source/StructureMap/Construction/ConstructorFunctionBuilder.cs =================================================================== --- trunk/Source/StructureMap/Construction/ConstructorFunctionBuilder.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Construction/ConstructorFunctionBuilder.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Reflection; @@ -18,20 +19,22 @@ { ConstructorInfo constructor = plugin.GetConstructor(); - var args = Expression.Parameter(typeof (IArguments), "x"); + ParameterExpression args = Expression.Parameter(typeof (IArguments), "x"); - - var arguments = constructor.GetParameters().Select(param => ToParameterValueGetter(args, param.ParameterType, param.Name)); - var ctorCall = Expression.New(constructor, arguments); + IEnumerable<Expression> arguments = + constructor.GetParameters().Select( + param => ToParameterValueGetter(args, param.ParameterType, param.Name)); - var lambda = Expression.Lambda(typeof (Func<IArguments, T>), ctorCall, args); + NewExpression ctorCall = Expression.New(constructor, arguments); + + LambdaExpression lambda = Expression.Lambda(typeof (Func<IArguments, T>), ctorCall, args); return (Func<IArguments, T>) lambda.Compile(); } public static Expression ToParameterValueGetter(ParameterExpression args, Type type, string argName) { - MethodInfo method = typeof(IArguments).GetMethod("Get").MakeGenericMethod(type); + MethodInfo method = typeof (IArguments).GetMethod("Get").MakeGenericMethod(type); return Expression.Call(args, method, Expression.Constant(argName)); } } Modified: trunk/Source/StructureMap/Construction/SetterBuilder.cs =================================================================== --- trunk/Source/StructureMap/Construction/SetterBuilder.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Construction/SetterBuilder.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -14,33 +14,31 @@ public Action<IArguments, T> BuildMandatorySetter(PropertyInfo property) { - var args = Expression.Parameter(typeof (IArguments), "args"); - var target = Expression.Parameter(typeof (T), "target"); + ParameterExpression args = Expression.Parameter(typeof (IArguments), "args"); + ParameterExpression target = Expression.Parameter(typeof (T), "target"); - var getValue = ConstructorFunctionBuilder<T>.ToParameterValueGetter(args, property.PropertyType, property.Name); - var method = property.GetSetMethod(); + Expression getValue = ConstructorFunctionBuilder<T>.ToParameterValueGetter(args, property.PropertyType, + property.Name); + MethodInfo method = property.GetSetMethod(); - var callSetMethod = Expression.Call(target, method, getValue); + MethodCallExpression callSetMethod = Expression.Call(target, method, getValue); - var lambda = Expression.Lambda(typeof (Action<IArguments, T>), callSetMethod, args, target); + LambdaExpression lambda = Expression.Lambda(typeof (Action<IArguments, T>), callSetMethod, args, target); return (Action<IArguments, T>) lambda.Compile(); } public Action<IArguments, T> BuildOptionalSetter(PropertyInfo property) { - var name = property.Name; - var func = BuildMandatorySetter(property); - return (args, target) => - { - if (args.Has(name)) func(args, target); - }; + string name = property.Name; + Action<IArguments, T> func = BuildMandatorySetter(property); + return (args, target) => { if (args.Has(name)) func(args, target); }; } public Action<IArguments, T> BuildOptionalSetter(string propertyName) { - PropertyInfo property = typeof(T).GetProperty(propertyName); + PropertyInfo property = typeof (T).GetProperty(propertyName); return BuildOptionalSetter(property); } } Modified: trunk/Source/StructureMap/Diagnostics/BuildError.cs =================================================================== --- trunk/Source/StructureMap/Diagnostics/BuildError.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Diagnostics/BuildError.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -52,20 +52,11 @@ _pluginType = pluginType; } - public List<BuildDependency> Dependencies - { - get { return _dependencies; } - } + public List<BuildDependency> Dependencies { get { return _dependencies; } } - public Instance Instance - { - get { return _instance; } - } + public Instance Instance { get { return _instance; } } - public Type PluginType - { - get { return _pluginType; } - } + public Type PluginType { get { return _pluginType; } } public StructureMapException Exception { get; set; } Modified: trunk/Source/StructureMap/Diagnostics/CharacterWidth.cs =================================================================== --- trunk/Source/StructureMap/Diagnostics/CharacterWidth.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Diagnostics/CharacterWidth.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -4,10 +4,7 @@ { private int _width; - internal int Width - { - get { return _width; } - } + internal int Width { get { return _width; } } internal static CharacterWidth[] For(int count) { Modified: trunk/Source/StructureMap/Diagnostics/DoctorRunner.cs =================================================================== --- trunk/Source/StructureMap/Diagnostics/DoctorRunner.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Diagnostics/DoctorRunner.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -13,7 +13,10 @@ public DoctorReport RunReport(string bootstrapperTypeName) { - var report = new DoctorReport {Result = DoctorResult.Success}; + var report = new DoctorReport + { + Result = DoctorResult.Success + }; IBootstrapper bootstrapper; Modified: trunk/Source/StructureMap/Diagnostics/Error.cs =================================================================== --- trunk/Source/StructureMap/Diagnostics/Error.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Diagnostics/Error.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -24,7 +24,8 @@ _message = ErrorMessages.GetMessage(errorCode, args); } - public Error(int errorCode, Exception ex, params object[] args) : this(errorCode, args) + public Error(int errorCode, Exception ex, params object[] args) + : this(errorCode, args) { _message += "\n\n" + ex.Message; @@ -41,10 +42,7 @@ } - public int Code - { - get { return _code; } - } + public int Code { get { return _code; } } #region IEquatable<Error> Members Modified: trunk/Source/StructureMap/Diagnostics/ValidationBuildSession.cs =================================================================== --- trunk/Source/StructureMap/Diagnostics/ValidationBuildSession.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Diagnostics/ValidationBuildSession.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -21,25 +21,17 @@ { } - public ValidationBuildSession(PluginGraph graph) : base(graph) + public ValidationBuildSession(PluginGraph graph) + : base(graph) { } - public bool Success - { - get { return _errors.BuildErrors.Length == 0 && _validationErrors.Count == 0; } - } + public bool Success { get { return _errors.BuildErrors.Length == 0 && _validationErrors.Count == 0; } } - public BuildError[] BuildErrors - { - get { return _errors.BuildErrors; } - } + public BuildError[] BuildErrors { get { return _errors.BuildErrors; } } - public ValidationError[] ValidationErrors - { - get { return _validationErrors.ToArray(); } - } + public ValidationError[] ValidationErrors { get { return _validationErrors.ToArray(); } } public override object CreateInstance(Type pluginType, Instance instance) { @@ -133,7 +125,6 @@ writer.WriteLine(); - writer.WriteLine("StructureMap Failures: {0} Build/Configuration Failures and {1} Validation Errors", _errors.BuildErrors.Length, _validationErrors.Count); Modified: trunk/Source/StructureMap/Diagnostics/ValidationError.cs =================================================================== --- trunk/Source/StructureMap/Diagnostics/ValidationError.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Diagnostics/ValidationError.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -1,7 +1,6 @@ using System; using System.IO; using System.Reflection; -using StructureMap.Graph; using StructureMap.Pipeline; namespace StructureMap.Diagnostics Modified: trunk/Source/StructureMap/Diagnostics/WhatDoIHaveWriter.cs =================================================================== --- trunk/Source/StructureMap/Diagnostics/WhatDoIHaveWriter.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Diagnostics/WhatDoIHaveWriter.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -67,11 +67,11 @@ { _writer.AddDivider('-'); var contents = new[] - { - "{0} ({1})".ToFormat(pluginType.PluginType.GetName(), pluginType.PluginType.GetFullName()), - string.Empty, - string.Empty - }; + { + "{0} ({1})".ToFormat(pluginType.PluginType.GetName(), pluginType.PluginType.GetFullName()), + string.Empty, + string.Empty + }; if (pluginType.Default != null) { Modified: trunk/Source/StructureMap/Example.cs =================================================================== --- trunk/Source/StructureMap/Example.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Example.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -1,5 +1,3 @@ -using System; - namespace StructureMap { public interface IMessageSender @@ -21,10 +19,12 @@ return new SendExpression(text, _messageSender); } + #region Nested type: SendExpression + public class SendExpression : ToExpression { + private readonly IMessageSender _messageSender; private readonly string _text; - private readonly IMessageSender _messageSender; private string _sender; public SendExpression(string text, IMessageSender messageSender) @@ -33,22 +33,28 @@ _messageSender = messageSender; } + void ToExpression.To(string receiver) + { + _messageSender.SendMessage(_text, _sender, receiver); + } + public ToExpression From(string sender) { _sender = sender; return this; } - - void ToExpression.To(string receiver) - { - _messageSender.SendMessage(_text, _sender, receiver); - } } + #endregion + + #region Nested type: ToExpression + public interface ToExpression { void To(string receiver); } + + #endregion } public class SendMessageRequest @@ -68,34 +74,34 @@ 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"); + // 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", "the message body", "PARTNER002"); - // or this? - sender.SendMessage("PARTNER001", "PARTNER002", "the message body"); - } + // 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 SendMessageFluently(FluentMessageSender sender) + { + sender + .SendText("the message body") + .From("PARTNER001").To("PARTNER002"); + } - public void SendMessageAsParameter(ParameterObjectMessageSender sender) - { - sender.Send(new SendMessageRequest() + public void SendMessageAsParameter(ParameterObjectMessageSender sender) { - Text = "the message body", - Receiver = "PARTNER001", - Sender = "PARTNER002" - }); + sender.Send(new SendMessageRequest + { + Text = "the message body", + Receiver = "PARTNER001", + Sender = "PARTNER002" + }); + } } - } } \ No newline at end of file Modified: trunk/Source/StructureMap/Exceptions/InstancePropertyValueException.cs =================================================================== --- trunk/Source/StructureMap/Exceptions/InstancePropertyValueException.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Exceptions/InstancePropertyValueException.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -15,8 +15,9 @@ { } - protected InstancePropertyValueException(SerializationInfo info, StreamingContext context) : - base(info, context) + protected InstancePropertyValueException(SerializationInfo info, StreamingContext context) + : + base(info, context) { } } Modified: trunk/Source/StructureMap/Exceptions/MissingPluginFamilyException.cs =================================================================== --- trunk/Source/StructureMap/Exceptions/MissingPluginFamilyException.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Exceptions/MissingPluginFamilyException.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -13,16 +13,14 @@ _message = string.Format("Type {0} is not a configured PluginFamily", pluginTypeName); } - protected MissingPluginFamilyException(SerializationInfo info, StreamingContext context) : - base(info, context) + protected MissingPluginFamilyException(SerializationInfo info, StreamingContext context) + : + base(info, context) { _message = info.GetString("message"); } - public override string Message - { - get { return _message; } - } + public override string Message { get { return _message; } } public override void GetObjectData(SerializationInfo info, StreamingContext context) { Modified: trunk/Source/StructureMap/Exceptions/StructureMapConfigurationException.cs =================================================================== --- trunk/Source/StructureMap/Exceptions/StructureMapConfigurationException.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Exceptions/StructureMapConfigurationException.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -6,13 +6,15 @@ [Serializable] public class StructureMapConfigurationException : ApplicationException { - public StructureMapConfigurationException(string message) : base(message) + public StructureMapConfigurationException(string message) + : base(message) { } - protected StructureMapConfigurationException(SerializationInfo info, StreamingContext context) : - base(info, context) + protected StructureMapConfigurationException(SerializationInfo info, StreamingContext context) + : + base(info, context) { } } Modified: trunk/Source/StructureMap/Graph/AssemblyScanner.cs =================================================================== --- trunk/Source/StructureMap/Graph/AssemblyScanner.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Graph/AssemblyScanner.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -40,9 +40,10 @@ { private readonly List<Assembly> _assemblies = new List<Assembly>(); private readonly CompositeFilter<Type> _filter = new CompositeFilter<Type>(); + private readonly ImplementationMap _implementationMap = new ImplementationMap(); - private readonly List<ITypeScanner> _scanners = new List<ITypeScanner>(); private readonly List<Action<PluginGraph>> _postScanningActions = new List<Action<PluginGraph>>(); + private readonly List<ITypeScanner> _scanners = new List<ITypeScanner>(); public AssemblyScanner() { @@ -174,8 +175,6 @@ With(new GenericConnectionScanner(openGenericType)); } - - private readonly ImplementationMap _implementationMap = new ImplementationMap(); public void SingleImplementationsOfInterface() { @@ -232,10 +231,8 @@ internal void ScanForAll(PluginGraph pluginGraph) { - pluginGraph.Types.For(_assemblies, _filter).Each(type => - { - _scanners.Each(x => x.Process(type, pluginGraph)); - }); + pluginGraph.Types.For(_assemblies, _filter).Each( + type => { _scanners.Each(x => x.Process(type, pluginGraph)); }); _postScanningActions.Each(x => x(pluginGraph)); } Modified: trunk/Source/StructureMap/Graph/ImplementationMap.cs =================================================================== --- trunk/Source/StructureMap/Graph/ImplementationMap.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Graph/ImplementationMap.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -10,6 +10,11 @@ { private readonly Cache<Type, List<Type>> _types = new Cache<Type, List<Type>>(t => new List<Type>()); + public void Process(Type type, PluginGraph graph) + { + RegisterType(type); + } + public void Register(Type interfaceType, Type concreteType) { _types[interfaceType].Add(concreteType); @@ -22,11 +27,6 @@ type.GetInterfaces().Where(i => i.IsVisible).Each(i => Register(i, type)); } - public void Process(Type type, PluginGraph graph) - { - RegisterType(type); - } - public void RegisterSingleImplementations(PluginGraph graph) { _types.Each((pluginType, types) => Modified: trunk/Source/StructureMap/Graph/PluginFamilyCollection.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginFamilyCollection.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Graph/PluginFamilyCollection.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -32,10 +32,7 @@ } } - public int Count - { - get { return _pluginFamilies.Count; } - } + public int Count { get { return _pluginFamilies.Count; } } public IEnumerable<PluginFamily> All { Modified: trunk/Source/StructureMap/Graph/PluginGraph.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginGraph.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Graph/PluginGraph.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -54,7 +54,7 @@ _reference.Target = _builder(); } - return (T)_reference.Target; + return (T) _reference.Target; } } } @@ -72,9 +72,9 @@ private readonly ProfileManager _profileManager = new ProfileManager(); private readonly List<Registry> _registries = new List<Registry>(); private readonly List<AssemblyScanner> _scanners = new List<AssemblyScanner>(); + private readonly WeakReference<TypePool> _types; private GraphLog _log = new GraphLog(); private bool _sealed; - private readonly WeakReference<TypePool> _types; public PluginGraph() @@ -83,13 +83,7 @@ _types = new WeakReference<TypePool>(() => new TypePool(this)); } - public TypePool Types - { - get - { - return _types.Value; - } - } + public TypePool Types { get { return _types.Value; } } public List<Registry> Registries { get { return _registries; } } Modified: trunk/Source/StructureMap/Interceptors/CompoundInterceptor.cs =================================================================== --- trunk/Source/StructureMap/Interceptors/CompoundInterceptor.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Interceptors/CompoundInterceptor.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -10,10 +10,7 @@ } - public InstanceInterceptor[] Interceptors - { - get { return _interceptors; } - } + public InstanceInterceptor[] Interceptors { get { return _interceptors; } } #region InstanceInterceptor Members Modified: trunk/Source/StructureMap/Interceptors/Interceptors.cs =================================================================== --- trunk/Source/StructureMap/Interceptors/Interceptors.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Interceptors/Interceptors.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -1,5 +1,6 @@ namespace StructureMap.Interceptors { public delegate object EnrichmentHandler<T>(T target); + public delegate object ContextEnrichmentHandler<T>(IContext context, T target); } \ No newline at end of file Modified: trunk/Source/StructureMap/Interceptors/MatchedTypeInterceptor.cs =================================================================== --- trunk/Source/StructureMap/Interceptors/MatchedTypeInterceptor.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Interceptors/MatchedTypeInterceptor.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -45,6 +45,5 @@ { _interception = interception; } - } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -1,7 +1,5 @@ using System; using System.Collections.Generic; -using StructureMap.Graph; -using StructureMap.TypeRules; namespace StructureMap.Pipeline { @@ -213,7 +211,7 @@ // _children.Add(name, instance); // } - + // } // protected void setChildArray(string name, Instance[] array) @@ -224,7 +222,7 @@ // { // throw new ApplicationException("There is a null value in the array of child Instances"); // } - + // } // _arrays.Add(name, array); Modified: trunk/Source/StructureMap/Pipeline/HttpContextLifecycle.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/HttpContextLifecycle.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Pipeline/HttpContextLifecycle.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -8,16 +8,6 @@ public static readonly string ITEM_NAME = "STRUCTUREMAP-INSTANCES"; - public static bool HasContext() - { - return HttpContext.Current != null; - } - - public static void DisposeAndClearAll() - { - new HttpContextLifecycle().FindCache().DisposeAndClear(); - } - public void EjectAll() { FindCache().DisposeAndClear(); @@ -33,7 +23,7 @@ { if (!items.Contains(ITEM_NAME)) { - MainObjectCache cache = new MainObjectCache(); + var cache = new MainObjectCache(); items.Add(ITEM_NAME, cache); return cache; @@ -41,10 +31,20 @@ } } - return (IObjectCache)items[ITEM_NAME]; + return (IObjectCache) items[ITEM_NAME]; } + public static bool HasContext() + { + return HttpContext.Current != null; + } + public static void DisposeAndClearAll() + { + new HttpContextLifecycle().FindCache().DisposeAndClear(); + } + + protected virtual IDictionary findHttpDictionary() { return HttpContext.Current.Items; Modified: trunk/Source/StructureMap/Pipeline/HybridSessionLifecycle.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/HybridSessionLifecycle.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Pipeline/HybridSessionLifecycle.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -2,6 +2,5 @@ { public class HybridSessionLifecycle : HttpLifecycleBase<HttpSessionLifecycle, ThreadLocalStorageLifecycle> { - } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/InstanceKey.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/InstanceKey.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Pipeline/InstanceKey.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -4,12 +4,8 @@ { public class InstanceKey { - public string Name { get; set; } - public Type PluginType { get; set; } - [Obsolete("Kill!")] - private WeakReference _session; - [Obsolete("Kill!")] - private WeakReference _instance; + [Obsolete("Kill!")] private WeakReference _instance; + [Obsolete("Kill!")] private WeakReference _session; public InstanceKey() { @@ -21,20 +17,16 @@ PluginType = pluginType; } + public string Name { get; set; } + public Type PluginType { get; set; } + [Obsolete("Kill!")] - public BuildSession Session - { - get { return (BuildSession) _session.Target; } - set { _session = new WeakReference(value); } - } + public BuildSession Session { get { return (BuildSession) _session.Target; } set { _session = new WeakReference(value); } } [Obsolete("Kill!")] public Instance Instance { - get - { - return (Instance) _instance.Target; - } + get { return (Instance) _instance.Target; } set { Name = value.Name; @@ -53,15 +45,16 @@ { if (ReferenceEquals(null, obj)) return false; if (ReferenceEquals(this, obj)) return true; - if (obj.GetType() != typeof(InstanceKey)) return false; - return Equals((InstanceKey)obj); + if (obj.GetType() != typeof (InstanceKey)) return false; + return Equals((InstanceKey) obj); } public override int GetHashCode() { unchecked { - return ((Name != null ? Name.GetHashCode() : 0) * 397) ^ (PluginType != null ? PluginType.GetHashCode() : 0); + return ((Name != null ? Name.GetHashCode() : 0)*397) ^ + (PluginType != null ? PluginType.GetHashCode() : 0); } } } Modified: trunk/Source/StructureMap/Pipeline/Lifecycles.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/Lifecycles.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Pipeline/Lifecycles.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -30,7 +30,7 @@ case InstanceScope.HybridHttpSession: return new HybridSessionLifecycle(); } - + throw new ArgumentOutOfRangeException("scope"); } } Modified: trunk/Source/StructureMap/Pipeline/MainObjectCache.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/MainObjectCache.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Pipeline/MainObjectCache.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -5,18 +5,12 @@ { public class MainObjectCache : IObjectCache { - private readonly IDictionary<InstanceKey, object> _objects = new Dictionary<InstanceKey,object>(); private readonly object _locker = new object(); + private readonly IDictionary<InstanceKey, object> _objects = new Dictionary<InstanceKey, object>(); - public object Locker - { - get { return _locker; } - } + public object Locker { get { return _locker; } } - public int Count - { - get { return _objects.Count; } - } + public int Count { get { return _objects.Count; } } public object Get(Type pluginType, Instance instance) { @@ -45,21 +39,23 @@ { lock (Locker) { - foreach (var @object in _objects.Values) + foreach (object @object in _objects.Values) { if (@object is Container) continue; - IDisposable disposable = @object as IDisposable; + var disposable = @object as IDisposable; if (disposable != null) { try { disposable.Dispose(); } - catch (Exception) { } + catch (Exception) + { + } } } - + _objects.Clear(); } } Modified: trunk/Source/StructureMap/Pipeline/SessionWrapper.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/SessionWrapper.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Pipeline/SessionWrapper.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -25,20 +25,11 @@ _session.CopyTo(array, index); } - public int Count - { - get { return _session.Count; } - } + public int Count { get { return _session.Count; } } - public object SyncRoot - { - get { return _session.SyncRoot; } - } + public object SyncRoot { get { return _session.SyncRoot; } } - public bool IsSynchronized - { - get { return _session.IsSynchronized; } - } + public bool IsSynchronized { get { return _session.IsSynchronized; } } public bool Contains(object key) { @@ -65,31 +56,15 @@ _session.Remove(key.ToString()); } - public object this[object key] - { - get { return _session[key.ToString()]; } - set { _session[key.ToString()] = value; } - } + public object this[object key] { get { return _session[key.ToString()]; } set { _session[key.ToString()] = value; } } - public ICollection Keys - { - get { return _session.Keys; } - } + public ICollection Keys { get { return _session.Keys; } } - public ICollection Values - { - get { throw new NotImplementedException(); } - } + public ICollection Values { get { throw new NotImplementedException(); } } - public bool IsReadOnly - { - get { return _session.IsReadOnly; } - } + public bool IsReadOnly { get { return _session.IsReadOnly; } } - public bool IsFixedSize - { - get { return false; } - } + public bool IsFixedSize { get { return false; } } #endregion } Modified: trunk/Source/StructureMap/Pipeline/UniquePerRequestLifecycle.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/UniquePerRequestLifecycle.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Pipeline/UniquePerRequestLifecycle.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -1,5 +1,3 @@ -using System; - namespace StructureMap.Pipeline { /// <summary> @@ -9,7 +7,6 @@ { public void EjectAll() { - } public IObjectCache FindCache() @@ -18,9 +15,9 @@ } //#region IBuildInterceptor Members - + //private IBuildPolicy _innerPolicy = new BuildPolicy(); - + //public IBuildPolicy InnerPolicy //{ // get { return _innerPolicy; } @@ -52,4 +49,4 @@ //#endregion } -} +} \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/UserControlInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/UserControlInstance.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Pipeline/UserControlInstance.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -1,6 +1,5 @@ using System; using System.Web.UI; -using StructureMap.Graph; using StructureMap.TypeRules; namespace StructureMap.Pipeline @@ -14,16 +13,10 @@ _url = url; } - protected override UserControlInstance thisInstance - { - get { return this; } - } + protected override UserControlInstance thisInstance { get { return this; } } - public string Url - { - get { return _url; } - } + public string Url { get { return _url; } } protected override object build(Type pluginType, BuildSession session) { Modified: trunk/Source/StructureMap/Source/BasicXmlMementoSource.cs =================================================================== --- trunk/Source/StructureMap/Source/BasicXmlMementoSource.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Source/BasicXmlMementoSource.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -15,10 +15,7 @@ _node = Node; } - public override string Description - { - get { return "BasicXmlMementoSource"; } - } + public override string Description { get { return "BasicXmlMementoSource"; } } protected override XmlNode getRootNode() { Modified: trunk/Source/StructureMap/Source/MemoryMementoSource.cs =================================================================== --- trunk/Source/StructureMap/Source/MemoryMementoSource.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/Source/MemoryMementoSource.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -14,10 +14,7 @@ _mementos = new Hashtable(); } - public override string Description - { - get { return "DefaultMementoSource"; } - } + public override string Description { get { return "DefaultMementoSource"; } } protected override InstanceMemento[] fetchInternalMementos() { Modified: trunk/Source/StructureMap/SystemRegistry.cs =================================================================== --- trunk/Source/StructureMap/SystemRegistry.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/SystemRegistry.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -30,7 +30,7 @@ private void AddLifecycleType<T>(InstanceScope scope) where T : ILifecycle { - addExpression(graph => graph.AddType(typeof(ILifecycle), typeof(T), scope.ToString())); + addExpression(graph => graph.AddType(typeof (ILifecycle), typeof (T), scope.ToString())); } private void AddMementoSourceType<T>(string name) Modified: trunk/Source/StructureMap/TypeExtensions.cs =================================================================== --- trunk/Source/StructureMap/TypeExtensions.cs 2009-12-26 18:26:08 UTC (rev 299) +++ trunk/Source/StructureMap/TypeExtensions.cs 2009-12-26 18:39:40 UTC (rev 300) @@ -153,7 +153,7 @@ public static IEnumerable<Type> AllInterfaces(this Type type) { - foreach (var @interface in type.GetInterfaces()) + foreach (Type @interface in type.GetInterfaces()) { yield return @interface; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-12-26 18:26:14
|
Revision: 299 http://structuremap.svn.sourceforge.net/structuremap/?rev=299&view=rev Author: jeremydmiller Date: 2009-12-26 18:26:08 +0000 (Sat, 26 Dec 2009) Log Message: ----------- eliminating an old file Removed Paths: ------------- trunk/Source/StructureMap/Graph/IHeavyweightTypeScanner.cs Deleted: trunk/Source/StructureMap/Graph/IHeavyweightTypeScanner.cs =================================================================== --- trunk/Source/StructureMap/Graph/IHeavyweightTypeScanner.cs 2009-12-26 18:18:44 UTC (rev 298) +++ trunk/Source/StructureMap/Graph/IHeavyweightTypeScanner.cs 2009-12-26 18:26:08 UTC (rev 299) @@ -1,64 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using StructureMap.TypeRules; -using StructureMap.Util; - -namespace StructureMap.Graph -{ - [Obsolete] - public interface IHeavyweightTypeScanner - { - void Process(PluginGraph graph, IEnumerable<TypeMap> typeMaps); - } - - - public class TypeMap - { - internal TypeMap(Type pluginType, IList<Type> concreteTypes) - { - PluginType = pluginType; - ConcreteTypes = new ReadOnlyCollection<Type>(concreteTypes); - } - - public IList<Type> ConcreteTypes { get; private set; } - public Type PluginType { get; private set; } - } - - internal class TypeMapBuilder : ITypeScanner, IDisposable - { - private readonly Cache<Type, List<Type>> _implementations = new Cache<Type, List<Type>>(t => new List<Type>()); - - public void Dispose() - { - //throw new NotImplementedException(); - //_implementations.Clear(); - } - - public void Process(Type type, PluginGraph graph) - { - if (!type.IsConcrete() || !Constructor.HasConstructors(type)) return; - IEnumerable<Type> pluginTypes = FindPluginTypes(type); - - foreach (Type pluginType in pluginTypes) - { - _implementations[pluginType].Add(type); - } - } - - private IEnumerable<Type> FindPluginTypes(Type type) - { - return new Type[0]; - // lets not worry about abstract base classes for now - return type.GetInterfaces().Where(t => t.IsPublic); - } - - public IEnumerable<TypeMap> GetTypeMaps() - { - return new TypeMap[0]; - throw new NotImplementedException(); - //return _implementations.Contents().Select(pair => new TypeMap(pair.Key, pair.Value)); - } - } -} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-12-26 18:18:54
|
Revision: 298 http://structuremap.svn.sourceforge.net/structuremap/?rev=298&view=rev Author: jeremydmiller Date: 2009-12-26 18:18:44 +0000 (Sat, 26 Dec 2009) Log Message: ----------- Overhaul of the "single implementation scanning" feature Modified Paths: -------------- trunk/Source/StructureMap/Graph/AssemblyScanner.cs trunk/Source/StructureMap/Graph/IAssemblyScanner.cs trunk/Source/StructureMap/StructureMap.csproj trunk/Source/StructureMap/TypeExtensions.cs trunk/Source/StructureMap.Testing/Graph/SingleImplementationScannerTester.cs trunk/Source/StructureMap.Testing/TypeExtensionsTester.cs Added Paths: ----------- trunk/Source/StructureMap/Graph/ImplementationMap.cs Removed Paths: ------------- trunk/Source/StructureMap/Graph/SingleImplementationScanner.cs Modified: trunk/Source/StructureMap/Graph/AssemblyScanner.cs =================================================================== --- trunk/Source/StructureMap/Graph/AssemblyScanner.cs 2009-12-26 17:37:30 UTC (rev 297) +++ trunk/Source/StructureMap/Graph/AssemblyScanner.cs 2009-12-26 18:18:44 UTC (rev 298) @@ -41,9 +41,8 @@ private readonly List<Assembly> _assemblies = new List<Assembly>(); private readonly CompositeFilter<Type> _filter = new CompositeFilter<Type>(); - private readonly List<IHeavyweightTypeScanner> _heavyweightScanners = new List<IHeavyweightTypeScanner>(); - private readonly List<ITypeScanner> _scanners = new List<ITypeScanner>(); + private readonly List<Action<PluginGraph>> _postScanningActions = new List<Action<PluginGraph>>(); public AssemblyScanner() { @@ -74,13 +73,6 @@ _scanners.Add(scanner); } - public void With(IHeavyweightTypeScanner heavyweightScanner) - { - if (_heavyweightScanners.Contains(heavyweightScanner)) return; - - _heavyweightScanners.Add(heavyweightScanner); - } - public void WithDefaultConventions() { With<DefaultConventionScanner>(); @@ -182,6 +174,15 @@ With(new GenericConnectionScanner(openGenericType)); } + + private readonly ImplementationMap _implementationMap = new ImplementationMap(); + + public void SingleImplementationsOfInterface() + { + _scanners.Fill(_implementationMap); + _postScanningActions.Add(graph => _implementationMap.RegisterSingleImplementations(graph)); + } + public void AssembliesFromApplicationBaseDirectory() { AssembliesFromApplicationBaseDirectory(a => true); @@ -231,35 +232,15 @@ internal void ScanForAll(PluginGraph pluginGraph) { - //TypeMapBuilder heavyweightScan = configureHeavyweightScan(); - pluginGraph.Types.For(_assemblies, _filter).Each(type => { _scanners.Each(x => x.Process(type, pluginGraph)); }); - //performHeavyweightScan(pluginGraph, heavyweightScan); + _postScanningActions.Each(x => x(pluginGraph)); } - private TypeMapBuilder configureHeavyweightScan() - { - var typeMapBuilder = new TypeMapBuilder(); - if (_heavyweightScanners.Count > 0) - { - With(typeMapBuilder); - } - return typeMapBuilder; - } - - [Obsolete] - private void performHeavyweightScan(PluginGraph pluginGraph, TypeMapBuilder typeMapBuilder) - { - IEnumerable<TypeMap> typeMaps = typeMapBuilder.GetTypeMaps(); - _heavyweightScanners.ForEach(scanner => scanner.Process(pluginGraph, typeMaps)); - typeMapBuilder.Dispose(); - } - public bool Contains(string assemblyName) { foreach (Assembly assembly in _assemblies) Modified: trunk/Source/StructureMap/Graph/IAssemblyScanner.cs =================================================================== --- trunk/Source/StructureMap/Graph/IAssemblyScanner.cs 2009-12-26 17:37:30 UTC (rev 297) +++ trunk/Source/StructureMap/Graph/IAssemblyScanner.cs 2009-12-26 18:18:44 UTC (rev 298) @@ -75,8 +75,6 @@ /// <param name="scanner"></param> void With(ITypeScanner scanner); - void With(IHeavyweightTypeScanner heavyweightScanner); - /// <summary> /// Adds the DefaultConventionScanner to the scanning operations. I.e., a concrete /// class named "Something" that implements "ISomething" will be automatically @@ -180,5 +178,12 @@ /// </example> /// <param name="openGenericType"></param> void ConnectImplementationsToTypesClosing(Type openGenericType); + + /// <summary> + /// Directs the scanning to automatically register any type that is the single + /// implementation of an interface against that interface. + /// The filters apply + /// </summary> + void SingleImplementationsOfInterface(); } } \ No newline at end of file Added: trunk/Source/StructureMap/Graph/ImplementationMap.cs =================================================================== --- trunk/Source/StructureMap/Graph/ImplementationMap.cs (rev 0) +++ trunk/Source/StructureMap/Graph/ImplementationMap.cs 2009-12-26 18:18:44 UTC (rev 298) @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using StructureMap.TypeRules; +using StructureMap.Util; + +namespace StructureMap.Graph +{ + public class ImplementationMap : ITypeScanner + { + private readonly Cache<Type, List<Type>> _types = new Cache<Type, List<Type>>(t => new List<Type>()); + + public void Register(Type interfaceType, Type concreteType) + { + _types[interfaceType].Add(concreteType); + } + + public void RegisterType(Type type) + { + if (!type.CanBeCreated()) return; + + type.GetInterfaces().Where(i => i.IsVisible).Each(i => Register(i, type)); + } + + public void Process(Type type, PluginGraph graph) + { + RegisterType(type); + } + + public void RegisterSingleImplementations(PluginGraph graph) + { + _types.Each((pluginType, types) => + { + if (types.Count == 1) + { + graph.AddType(pluginType, types[0]); + } + }); + } + } +} \ No newline at end of file Deleted: trunk/Source/StructureMap/Graph/SingleImplementationScanner.cs =================================================================== --- trunk/Source/StructureMap/Graph/SingleImplementationScanner.cs 2009-12-26 17:37:30 UTC (rev 297) +++ trunk/Source/StructureMap/Graph/SingleImplementationScanner.cs 2009-12-26 18:18:44 UTC (rev 298) @@ -1,16 +0,0 @@ -using System.Collections.Generic; -using System.Linq; - -namespace StructureMap.Graph -{ - public class SingleImplementationScanner : IHeavyweightTypeScanner - { - public void Process(PluginGraph graph, IEnumerable<TypeMap> typeMaps) - { - foreach (TypeMap map in typeMaps.Where(map => map.ConcreteTypes.Count == 1)) - { - graph.AddType(map.PluginType, map.ConcreteTypes[0]); - } - } - } -} \ No newline at end of file Modified: trunk/Source/StructureMap/StructureMap.csproj =================================================================== --- trunk/Source/StructureMap/StructureMap.csproj 2009-12-26 17:37:30 UTC (rev 297) +++ trunk/Source/StructureMap/StructureMap.csproj 2009-12-26 18:18:44 UTC (rev 298) @@ -362,11 +362,10 @@ <Compile Include="Graph\FindAllTypesFilter.cs" /> <Compile Include="Graph\FindRegistriesScanner.cs" /> <Compile Include="Graph\IAssemblyScanner.cs" /> - <Compile Include="Graph\IHeavyweightTypeScanner.cs" /> + <Compile Include="Graph\ImplementationMap.cs" /> <Compile Include="Graph\ITypeScanner.cs" /> <Compile Include="Graph\PluggableAttributeScanner.cs" /> <Compile Include="Graph\PluginCache.cs" /> - <Compile Include="Graph\SingleImplementationScanner.cs" /> <Compile Include="IContext.cs" /> <Compile Include="Pipeline\Arguments.cs" /> <Compile Include="Pipeline\ArrayCoercion.cs" /> Modified: trunk/Source/StructureMap/TypeExtensions.cs =================================================================== --- trunk/Source/StructureMap/TypeExtensions.cs 2009-12-26 17:37:30 UTC (rev 297) +++ trunk/Source/StructureMap/TypeExtensions.cs 2009-12-26 18:18:44 UTC (rev 298) @@ -7,6 +7,13 @@ { public static class BasicExtensions { + public static void Fill<T>(this IList<T> list, T value) + { + if (list.Contains(value)) return; + list.Add(value); + } + + public static void TryGet<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, Action<TValue> action) { @@ -139,6 +146,19 @@ return type.FullName; } + public static bool CanBeCreated(this Type type) + { + return type.IsConcrete() && Constructor.HasConstructors(type); + } + + public static IEnumerable<Type> AllInterfaces(this Type type) + { + foreach (var @interface in type.GetInterfaces()) + { + yield return @interface; + } + } + /// <summary> /// Determines if the pluggedType can be upcast to the pluginType /// </summary> Modified: trunk/Source/StructureMap.Testing/Graph/SingleImplementationScannerTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/SingleImplementationScannerTester.cs 2009-12-26 17:37:30 UTC (rev 297) +++ trunk/Source/StructureMap.Testing/Graph/SingleImplementationScannerTester.cs 2009-12-26 18:18:44 UTC (rev 298) @@ -13,7 +13,7 @@ typeof (Type).IsValueType.ShouldBeFalse(); } - [Test, Ignore("Come back to this")] + [Test] public void registers_plugins_that_only_have_a_single_implementation() { var container = new Container(registry => @@ -22,7 +22,7 @@ { x.TheCallingAssembly(); x.IncludeNamespaceContainingType<SingleImplementationScannerTester>(); - x.With(new SingleImplementationScanner()); + x.SingleImplementationsOfInterface(); }); }); Modified: trunk/Source/StructureMap.Testing/TypeExtensionsTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/TypeExtensionsTester.cs 2009-12-26 17:37:30 UTC (rev 297) +++ trunk/Source/StructureMap.Testing/TypeExtensionsTester.cs 2009-12-26 18:18:44 UTC (rev 298) @@ -102,5 +102,22 @@ Assert.IsTrue(typeof (string).IsString()); Assert.IsFalse(typeof (int).IsString()); } + + [Test] + public void get_all_interfaces() + { + typeof(C3).AllInterfaces().ShouldHaveTheSameElementsAs(typeof(I1), typeof(I2), typeof(I3)); + typeof(C2).AllInterfaces().ShouldHaveTheSameElementsAs(typeof(I1), typeof(I2)); + typeof(C1).AllInterfaces().ShouldHaveTheSameElementsAs(typeof(I1)); + } } + + + public interface I1{} + public interface I2{} + public interface I3{} + + public class C1 : I1{} + public class C2 : C1, I2{} + public class C3 : C2, I3{} } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-12-26 17:37:37
|
Revision: 297 http://structuremap.svn.sourceforge.net/structuremap/?rev=297&view=rev Author: jeremydmiller Date: 2009-12-26 17:37:30 +0000 (Sat, 26 Dec 2009) Log Message: ----------- Redo of the assembly scanning. Mild optimization Modified Paths: -------------- trunk/Source/StructureMap/Graph/AssemblyScanner.cs trunk/Source/StructureMap/Graph/IHeavyweightTypeScanner.cs trunk/Source/StructureMap/Graph/PluginGraph.cs trunk/Source/StructureMap/StructureMap.csproj Added Paths: ----------- trunk/Source/StructureMap/Graph/CompositeFilter.cs trunk/Source/StructureMap/Graph/CompositePredicate.cs trunk/Source/StructureMap/Graph/IAssemblyScanner.cs Modified: trunk/Source/StructureMap/Graph/AssemblyScanner.cs =================================================================== --- trunk/Source/StructureMap/Graph/AssemblyScanner.cs 2009-12-26 05:45:56 UTC (rev 296) +++ trunk/Source/StructureMap/Graph/AssemblyScanner.cs 2009-12-26 17:37:30 UTC (rev 297) @@ -5,194 +5,44 @@ using System.Linq; using System.Reflection; using StructureMap.TypeRules; +using StructureMap.Util; namespace StructureMap.Graph { - public interface IAssemblyScanner + public class TypePool { - #region Designating Assemblies + private readonly Cache<Assembly, Type[]> _types = new Cache<Assembly, Type[]>(); - /// <summary> - /// Add an Assembly to the scanning operation - /// </summary> - /// <param name="assembly"></param> - void Assembly(Assembly assembly); + public TypePool(PluginGraph graph) + { + _types.OnMissing = assembly => + { + try + { + return assembly.GetExportedTypes(); + } + catch (Exception ex) + { + graph.Log.RegisterError(170, ex, assembly.FullName); + return new Type[0]; + } + }; + } - /// <summary> - /// Add an Assembly by name to the scanning operation - /// </summary> - /// <param name="assemblyName"></param> - void Assembly(string assemblyName); - - /// <summary> - /// Add the currently executing Assembly to the scanning operation - /// </summary> - void TheCallingAssembly(); - - /// <summary> - /// Add the Assembly that contains type T to the scanning operation - /// </summary> - /// <typeparam name="T"></typeparam> - void AssemblyContainingType<T>(); - - /// <summary> - /// Add the Assembly that contains type to the scanning operation - /// </summary> - /// <param name="type"></param> - void AssemblyContainingType(Type type); - - /// <summary> - /// Sweep the designated path and add any Assembly's found in this folder to the - /// scanning operation - /// </summary> - /// <param name="path"></param> - void AssembliesFromPath(string path); - - /// <summary> - /// Sweep the designated path and add any Assembly's found in this folder to the - /// scanning operation. The assemblyFilter can be used to filter or limit the - /// Assembly's that are picked up. - /// </summary> - /// <param name="path"></param> - /// <param name="assemblyFilter"></param> - void AssembliesFromPath(string path, Predicate<Assembly> assemblyFilter); - - /// <summary> - /// Sweep the application base directory of current app domain and add any Assembly's - /// found to the scanning operation. - /// </summary> - void AssembliesFromApplicationBaseDirectory(); - - /// <summary> - /// Sweep the application base directory of current app domain and add any Assembly's - /// found to the scanning operation. The assemblyFilter can be used to filter or limit the - /// Assembly's that are picked up. - /// </summary> - void AssembliesFromApplicationBaseDirectory(Predicate<Assembly> assemblyFilter); - - #endregion - - #region Adding TypeScanners - - /// <summary> - /// Adds an ITypeScanner object to the scanning operation - /// </summary> - /// <param name="scanner"></param> - void With(ITypeScanner scanner); - - void With(IHeavyweightTypeScanner heavyweightScanner); - - /// <summary> - /// Adds the DefaultConventionScanner to the scanning operations. I.e., a concrete - /// class named "Something" that implements "ISomething" will be automatically - /// added to PluginType "ISomething" - /// </summary> - void WithDefaultConventions(); - - /// <summary> - /// Creates and adds a new ITypeScanner of type T to this scanning operation - /// </summary> - /// <typeparam name="T"></typeparam> - void With<T>() where T : ITypeScanner, new(); - - #endregion - - #region Other options - - /// <summary> - /// Directs the scanning operation to automatically detect and include any Registry - /// classes found in the Assembly's being scanned - /// </summary> - void LookForRegistries(); - - /// <summary> - /// Add all concrete types of the Plugin Type as Instances of Plugin Type - /// </summary> - /// <typeparam name="PLUGINTYPE"></typeparam> - FindAllTypesFilter AddAllTypesOf<PLUGINTYPE>(); - - /// <summary> - /// Add all concrete types of the Plugin Type as Instances of Plugin Type - /// </summary> - /// <param name="pluginType"></param> - FindAllTypesFilter AddAllTypesOf(Type pluginType); - - /// <summary> - /// Makes this scanning operation ignore all [PluginFamily] and [Pluggable] attributes - /// </summary> - void IgnoreStructureMapAttributes(); - - #endregion - - #region Filtering types - - /// <summary> - /// Exclude types that match the Predicate from being scanned - /// </summary> - /// <param name="exclude"></param> - void Exclude(Predicate<Type> exclude); - - /// <summary> - /// Exclude all types in this nameSpace or its children from the scanning operation - /// </summary> - /// <param name="nameSpace"></param> - void ExcludeNamespace(string nameSpace); - - /// <summary> - /// Exclude all types in this nameSpace or its children from the scanning operation - /// </summary> - /// <typeparam name="T"></typeparam> - void ExcludeNamespaceContainingType<T>(); - - /// <summary> - /// Only include types matching the Predicate in the scanning operation. You can - /// use multiple Include() calls in a single scanning operation - /// </summary> - /// <param name="predicate"></param> - void Include(Predicate<Type> predicate); - - /// <summary> - /// Only include types from this nameSpace or its children in the scanning operation. You can - /// use multiple Include() calls in a single scanning operation - /// </summary> - /// <param name="nameSpace"></param> - void IncludeNamespace(string nameSpace); - - /// <summary> - /// Only include types from this nameSpace or its children in the scanning operation. You can - /// use multiple Include() calls in a single scanning operation - /// </summary> - /// <typeparam name="T"></typeparam> - void IncludeNamespaceContainingType<T>(); - - /// <summary> - /// Exclude this specific type from the scanning operation - /// </summary> - /// <typeparam name="T"></typeparam> - void ExcludeType<T>(); - - // ... Other methods - - #endregion - - // ... Other methods - - /// <summary> - /// Scans for PluginType's and Concrete Types that close the given open generic type - /// </summary> - /// <example> - /// - /// </example> - /// <param name="openGenericType"></param> - void ConnectImplementationsToTypesClosing(Type openGenericType); + public IEnumerable<Type> For(IEnumerable<Assembly> assemblies, CompositeFilter<Type> filter) + { + return assemblies.SelectMany(x => _types[x].Where(filter.Matches)); + } } + public class AssemblyScanner : IAssemblyScanner { private readonly List<Assembly> _assemblies = new List<Assembly>(); - private readonly List<Predicate<Type>> _excludes = new List<Predicate<Type>>(); + private readonly CompositeFilter<Type> _filter = new CompositeFilter<Type>(); + private readonly List<IHeavyweightTypeScanner> _heavyweightScanners = new List<IHeavyweightTypeScanner>(); - private readonly List<Predicate<Type>> _includes = new List<Predicate<Type>>(); + private readonly List<ITypeScanner> _scanners = new List<ITypeScanner>(); public AssemblyScanner() @@ -292,9 +142,9 @@ } - public void Exclude(Predicate<Type> exclude) + public void Exclude(Func<Type, bool> exclude) { - _excludes.Add(exclude); + _filter.Excludes += exclude; } public void ExcludeNamespace(string nameSpace) @@ -307,9 +157,9 @@ ExcludeNamespace(typeof (T).Namespace); } - public void Include(Predicate<Type> predicate) + public void Include(Func<Type, bool> predicate) { - _includes.Add(predicate); + _filter.Includes += predicate; } public void IncludeNamespace(string nameSpace) @@ -381,31 +231,17 @@ internal void ScanForAll(PluginGraph pluginGraph) { - TypeMapBuilder heavyweightScan = configureHeavyweightScan(); + //TypeMapBuilder heavyweightScan = configureHeavyweightScan(); - _assemblies.ForEach(assem => scanTypesInAssembly(assem, pluginGraph)); - - performHeavyweightScan(pluginGraph, heavyweightScan); - } - - private void scanTypesInAssembly(Assembly assembly, PluginGraph graph) - { - try + pluginGraph.Types.For(_assemblies, _filter).Each(type => { - foreach (Type type in assembly.GetExportedTypes()) - { - if (!isInTheIncludes(type)) continue; - if (isInTheExcludes(type)) continue; + _scanners.Each(x => x.Process(type, pluginGraph)); + }); - _scanners.ForEach(scanner => scanner.Process(type, graph)); - } - } - catch (Exception ex) - { - graph.Log.RegisterError(170, ex, assembly.FullName); - } + //performHeavyweightScan(pluginGraph, heavyweightScan); } + private TypeMapBuilder configureHeavyweightScan() { var typeMapBuilder = new TypeMapBuilder(); @@ -416,6 +252,7 @@ return typeMapBuilder; } + [Obsolete] private void performHeavyweightScan(PluginGraph pluginGraph, TypeMapBuilder typeMapBuilder) { IEnumerable<TypeMap> typeMaps = typeMapBuilder.GetTypeMaps(); @@ -423,31 +260,6 @@ typeMapBuilder.Dispose(); } - private bool isInTheExcludes(Type type) - { - if (_excludes.Count == 0) return false; - - foreach (var exclude in _excludes) - { - if (exclude(type)) return true; - } - - return false; - } - - private bool isInTheIncludes(Type type) - { - if (_includes.Count == 0) return true; - - - foreach (var include in _includes) - { - if (include(type)) return true; - } - - return false; - } - public bool Contains(string assemblyName) { foreach (Assembly assembly in _assemblies) Added: trunk/Source/StructureMap/Graph/CompositeFilter.cs =================================================================== --- trunk/Source/StructureMap/Graph/CompositeFilter.cs (rev 0) +++ trunk/Source/StructureMap/Graph/CompositeFilter.cs 2009-12-26 17:37:30 UTC (rev 297) @@ -0,0 +1,16 @@ +namespace StructureMap.Graph +{ + public class CompositeFilter<T> + { + private readonly CompositePredicate<T> _excludes = new CompositePredicate<T>(); + private readonly CompositePredicate<T> _includes = new CompositePredicate<T>(); + + public CompositePredicate<T> Includes { get { return _includes; } set { } } + public CompositePredicate<T> Excludes { get { return _excludes; } set { } } + + public bool Matches(T target) + { + return Includes.MatchesAny(target) && Excludes.DoesNotMatcheAny(target); + } + } +} \ No newline at end of file Added: trunk/Source/StructureMap/Graph/CompositePredicate.cs =================================================================== --- trunk/Source/StructureMap/Graph/CompositePredicate.cs (rev 0) +++ trunk/Source/StructureMap/Graph/CompositePredicate.cs 2009-12-26 17:37:30 UTC (rev 297) @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace StructureMap.Graph +{ + public class CompositePredicate<T> + { + private readonly List<Func<T, bool>> _list = new List<Func<T, bool>>(); + private Func<T, bool> _matchesAll = x => true; + private Func<T, bool> _matchesAny = x => true; + private Func<T, bool> _matchesNone = x => false; + + public void Add(Func<T, bool> filter) + { + _matchesAll = x => _list.All(predicate => predicate(x)); + _matchesAny = x => _list.Any(predicate => predicate(x)); + _matchesNone = x => !MatchesAny(x); + + _list.Add(filter); + } + + public static CompositePredicate<T> operator +(CompositePredicate<T> invokes, Func<T, bool> filter) + { + invokes.Add(filter); + return invokes; + } + + public bool MatchesAll(T target) + { + return _matchesAll(target); + } + + public bool MatchesAny(T target) + { + return _matchesAny(target); + } + + public bool MatchesNone(T target) + { + return _matchesNone(target); + } + + public bool DoesNotMatcheAny(T target) + { + return _list.Count == 0 ? true : !MatchesAny(target); + } + } +} \ No newline at end of file Added: trunk/Source/StructureMap/Graph/IAssemblyScanner.cs =================================================================== --- trunk/Source/StructureMap/Graph/IAssemblyScanner.cs (rev 0) +++ trunk/Source/StructureMap/Graph/IAssemblyScanner.cs 2009-12-26 17:37:30 UTC (rev 297) @@ -0,0 +1,184 @@ +using System; +using System.Reflection; + +namespace StructureMap.Graph +{ + public interface IAssemblyScanner + { + #region Designating Assemblies + + /// <summary> + /// Add an Assembly to the scanning operation + /// </summary> + /// <param name="assembly"></param> + void Assembly(Assembly assembly); + + /// <summary> + /// Add an Assembly by name to the scanning operation + /// </summary> + /// <param name="assemblyName"></param> + void Assembly(string assemblyName); + + /// <summary> + /// Add the currently executing Assembly to the scanning operation + /// </summary> + void TheCallingAssembly(); + + /// <summary> + /// Add the Assembly that contains type T to the scanning operation + /// </summary> + /// <typeparam name="T"></typeparam> + void AssemblyContainingType<T>(); + + /// <summary> + /// Add the Assembly that contains type to the scanning operation + /// </summary> + /// <param name="type"></param> + void AssemblyContainingType(Type type); + + /// <summary> + /// Sweep the designated path and add any Assembly's found in this folder to the + /// scanning operation + /// </summary> + /// <param name="path"></param> + void AssembliesFromPath(string path); + + /// <summary> + /// Sweep the designated path and add any Assembly's found in this folder to the + /// scanning operation. The assemblyFilter can be used to filter or limit the + /// Assembly's that are picked up. + /// </summary> + /// <param name="path"></param> + /// <param name="assemblyFilter"></param> + void AssembliesFromPath(string path, Predicate<Assembly> assemblyFilter); + + /// <summary> + /// Sweep the application base directory of current app domain and add any Assembly's + /// found to the scanning operation. + /// </summary> + void AssembliesFromApplicationBaseDirectory(); + + /// <summary> + /// Sweep the application base directory of current app domain and add any Assembly's + /// found to the scanning operation. The assemblyFilter can be used to filter or limit the + /// Assembly's that are picked up. + /// </summary> + void AssembliesFromApplicationBaseDirectory(Predicate<Assembly> assemblyFilter); + + #endregion + + #region Adding TypeScanners + + /// <summary> + /// Adds an ITypeScanner object to the scanning operation + /// </summary> + /// <param name="scanner"></param> + void With(ITypeScanner scanner); + + void With(IHeavyweightTypeScanner heavyweightScanner); + + /// <summary> + /// Adds the DefaultConventionScanner to the scanning operations. I.e., a concrete + /// class named "Something" that implements "ISomething" will be automatically + /// added to PluginType "ISomething" + /// </summary> + void WithDefaultConventions(); + + /// <summary> + /// Creates and adds a new ITypeScanner of type T to this scanning operation + /// </summary> + /// <typeparam name="T"></typeparam> + void With<T>() where T : ITypeScanner, new(); + + #endregion + + #region Other options + + /// <summary> + /// Directs the scanning operation to automatically detect and include any Registry + /// classes found in the Assembly's being scanned + /// </summary> + void LookForRegistries(); + + /// <summary> + /// Add all concrete types of the Plugin Type as Instances of Plugin Type + /// </summary> + /// <typeparam name="PLUGINTYPE"></typeparam> + FindAllTypesFilter AddAllTypesOf<PLUGINTYPE>(); + + /// <summary> + /// Add all concrete types of the Plugin Type as Instances of Plugin Type + /// </summary> + /// <param name="pluginType"></param> + FindAllTypesFilter AddAllTypesOf(Type pluginType); + + /// <summary> + /// Makes this scanning operation ignore all [PluginFamily] and [Pluggable] attributes + /// </summary> + void IgnoreStructureMapAttributes(); + + #endregion + + #region Filtering types + + /// <summary> + /// Exclude types that match the Predicate from being scanned + /// </summary> + /// <param name="exclude"></param> + void Exclude(Func<Type, bool> exclude); + + /// <summary> + /// Exclude all types in this nameSpace or its children from the scanning operation + /// </summary> + /// <param name="nameSpace"></param> + void ExcludeNamespace(string nameSpace); + + /// <summary> + /// Exclude all types in this nameSpace or its children from the scanning operation + /// </summary> + /// <typeparam name="T"></typeparam> + void ExcludeNamespaceContainingType<T>(); + + /// <summary> + /// Only include types matching the Predicate in the scanning operation. You can + /// use multiple Include() calls in a single scanning operation + /// </summary> + /// <param name="predicate"></param> + void Include(Func<Type, bool> predicate); + + /// <summary> + /// Only include types from this nameSpace or its children in the scanning operation. You can + /// use multiple Include() calls in a single scanning operation + /// </summary> + /// <param name="nameSpace"></param> + void IncludeNamespace(string nameSpace); + + /// <summary> + /// Only include types from this nameSpace or its children in the scanning operation. You can + /// use multiple Include() calls in a single scanning operation + /// </summary> + /// <typeparam name="T"></typeparam> + void IncludeNamespaceContainingType<T>(); + + /// <summary> + /// Exclude this specific type from the scanning operation + /// </summary> + /// <typeparam name="T"></typeparam> + void ExcludeType<T>(); + + // ... Other methods + + #endregion + + // ... Other methods + + /// <summary> + /// Scans for PluginType's and Concrete Types that close the given open generic type + /// </summary> + /// <example> + /// + /// </example> + /// <param name="openGenericType"></param> + void ConnectImplementationsToTypesClosing(Type openGenericType); + } +} \ No newline at end of file Modified: trunk/Source/StructureMap/Graph/IHeavyweightTypeScanner.cs =================================================================== --- trunk/Source/StructureMap/Graph/IHeavyweightTypeScanner.cs 2009-12-26 05:45:56 UTC (rev 296) +++ trunk/Source/StructureMap/Graph/IHeavyweightTypeScanner.cs 2009-12-26 17:37:30 UTC (rev 297) @@ -7,6 +7,7 @@ namespace StructureMap.Graph { + [Obsolete] public interface IHeavyweightTypeScanner { void Process(PluginGraph graph, IEnumerable<TypeMap> typeMaps); Modified: trunk/Source/StructureMap/Graph/PluginGraph.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginGraph.cs 2009-12-26 05:45:56 UTC (rev 296) +++ trunk/Source/StructureMap/Graph/PluginGraph.cs 2009-12-26 17:37:30 UTC (rev 297) @@ -33,6 +33,33 @@ void AddType(Type pluggedType); } + + public class WeakReference<T> + { + private readonly Func<T> _builder; + private readonly WeakReference _reference; + + public WeakReference(Func<T> builder) + { + _builder = builder; + _reference = new WeakReference(_builder()); + } + + public T Value + { + get + { + if (!_reference.IsAlive) + { + _reference.Target = _builder(); + } + + return (T)_reference.Target; + } + } + } + + /// <summary> /// Models the runtime configuration of a StructureMap Container /// </summary> @@ -47,17 +74,21 @@ private readonly List<AssemblyScanner> _scanners = new List<AssemblyScanner>(); private GraphLog _log = new GraphLog(); private bool _sealed; + private readonly WeakReference<TypePool> _types; public PluginGraph() { _pluginFamilies = new PluginFamilyCollection(this); + _types = new WeakReference<TypePool>(() => new TypePool(this)); } - public PluginGraph(AssemblyScanner assemblies) + public TypePool Types { - _pluginFamilies = new PluginFamilyCollection(this); - _scanners.Add(assemblies); + get + { + return _types.Value; + } } public List<Registry> Registries { get { return _registries; } } Modified: trunk/Source/StructureMap/StructureMap.csproj =================================================================== --- trunk/Source/StructureMap/StructureMap.csproj 2009-12-26 05:45:56 UTC (rev 296) +++ trunk/Source/StructureMap/StructureMap.csproj 2009-12-26 17:37:30 UTC (rev 297) @@ -356,9 +356,12 @@ <Compile Include="ErrorMessages.cs" /> <Compile Include="Example.cs" /> <Compile Include="Extensions.cs" /> + <Compile Include="Graph\CompositeFilter.cs" /> + <Compile Include="Graph\CompositePredicate.cs" /> <Compile Include="Graph\FamilyAttributeScanner.cs" /> <Compile Include="Graph\FindAllTypesFilter.cs" /> <Compile Include="Graph\FindRegistriesScanner.cs" /> + <Compile Include="Graph\IAssemblyScanner.cs" /> <Compile Include="Graph\IHeavyweightTypeScanner.cs" /> <Compile Include="Graph\ITypeScanner.cs" /> <Compile Include="Graph\PluggableAttributeScanner.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-12-26 05:46:06
|
Revision: 296 http://structuremap.svn.sourceforge.net/structuremap/?rev=296&view=rev Author: jeremydmiller Date: 2009-12-26 05:45:56 +0000 (Sat, 26 Dec 2009) Log Message: ----------- Big R# code cleanup after the big re-architecture Modified Paths: -------------- trunk/Source/StructureMap/Attributes/PluggableAttribute.cs trunk/Source/StructureMap/Attributes/PluginFamilyAttribute.cs trunk/Source/StructureMap/BuildSession.cs trunk/Source/StructureMap/CloseGenericTypeExpression.cs trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs trunk/Source/StructureMap/Configuration/DSL/Expressions/ProfileExpression.cs trunk/Source/StructureMap/Configuration/DSL/Registry.cs trunk/Source/StructureMap/Configuration/DSL/SetterConvention.cs trunk/Source/StructureMap/Configuration/GraphBuilder.cs trunk/Source/StructureMap/Configuration/XmlConstants.cs trunk/Source/StructureMap/ConfigurationExpression.cs trunk/Source/StructureMap/Construction/InstanceBuilder.cs trunk/Source/StructureMap/Container.cs trunk/Source/StructureMap/Diagnostics/Doctor.cs trunk/Source/StructureMap/Diagnostics/GraphLog.cs trunk/Source/StructureMap/Diagnostics/InstanceToken.cs trunk/Source/StructureMap/Exceptions/StructureMapException.cs trunk/Source/StructureMap/ExplicitArgsExpression.cs trunk/Source/StructureMap/Extensions.cs trunk/Source/StructureMap/Graph/AssemblyScanner.cs trunk/Source/StructureMap/Graph/FindAllTypesFilter.cs trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs trunk/Source/StructureMap/Graph/IHeavyweightTypeScanner.cs trunk/Source/StructureMap/Graph/IPluginFamily.cs trunk/Source/StructureMap/Graph/Plugin.cs trunk/Source/StructureMap/Graph/PluginCache.cs trunk/Source/StructureMap/Graph/PluginFamily.cs trunk/Source/StructureMap/Graph/PluginGraph.cs trunk/Source/StructureMap/Graph/SetterProperty.cs trunk/Source/StructureMap/Graph/SetterPropertyCollection.cs trunk/Source/StructureMap/Graph/SingleImplementationScanner.cs trunk/Source/StructureMap/Graph/TypePath.cs trunk/Source/StructureMap/IContainer.cs trunk/Source/StructureMap/IContext.cs trunk/Source/StructureMap/IInstanceFactory.cs trunk/Source/StructureMap/InitializationExpression.cs trunk/Source/StructureMap/InstanceCache.cs trunk/Source/StructureMap/InstanceFactory.cs trunk/Source/StructureMap/InstanceMemento.cs trunk/Source/StructureMap/Interceptors/FilteredInstanceInterceptor.cs trunk/Source/StructureMap/MementoSource.cs trunk/Source/StructureMap/MemoryInstanceMemento.cs trunk/Source/StructureMap/Model.cs trunk/Source/StructureMap/ObjectFactory.cs trunk/Source/StructureMap/Pipeline/BuildFrame.cs trunk/Source/StructureMap/Pipeline/BuildStack.cs trunk/Source/StructureMap/Pipeline/ConditionalInstance.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs trunk/Source/StructureMap/Pipeline/DefaultInstance.cs trunk/Source/StructureMap/Pipeline/EnumerableInstance.cs trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs trunk/Source/StructureMap/Pipeline/IEnumerableCoercion.cs trunk/Source/StructureMap/Pipeline/IObjectCache.cs trunk/Source/StructureMap/Pipeline/Instance.cs trunk/Source/StructureMap/Pipeline/LambdaInstance.cs trunk/Source/StructureMap/Pipeline/NulloObjectCache.cs trunk/Source/StructureMap/Pipeline/ObjectBuilder.cs trunk/Source/StructureMap/Pipeline/ObjectInstance.cs trunk/Source/StructureMap/Pipeline/Profile.cs trunk/Source/StructureMap/Pipeline/ProfileManager.cs trunk/Source/StructureMap/Pipeline/PropertyExpression.cs trunk/Source/StructureMap/Pipeline/PrototypeInstance.cs trunk/Source/StructureMap/Pipeline/ReferencedInstance.cs trunk/Source/StructureMap/Pipeline/SerializedInstance.cs trunk/Source/StructureMap/Pipeline/SmartInstance.cs trunk/Source/StructureMap/Pipeline/ThreadLocalStorageLifecycle.cs trunk/Source/StructureMap/PipelineGraph.cs trunk/Source/StructureMap/Properties/AssemblyInfo.cs trunk/Source/StructureMap/ReflectionHelper.cs trunk/Source/StructureMap/Source/DirectoryXmlMementoSource.cs trunk/Source/StructureMap/Source/SingleEmbeddedXmlMementoSource.cs trunk/Source/StructureMap/Source/TemplatedMementoSource.cs trunk/Source/StructureMap/Source/XmlAttributeInstanceMemento.cs trunk/Source/StructureMap/Source/XmlFileMementoSource.cs trunk/Source/StructureMap/Source/XmlMementoSource.cs trunk/Source/StructureMap/Source/XmlNodeInstanceMemento.cs trunk/Source/StructureMap/Source/XmlTemplater.cs trunk/Source/StructureMap/StructureMapConfiguration.cs trunk/Source/StructureMap/SystemRegistry.cs trunk/Source/StructureMap/TypeExtensions.cs trunk/Source/StructureMap/Util/Cache.cs trunk/Source/StructureMap.AutoMocking/AutoMockedContainer.cs trunk/Source/StructureMap.AutoMocking/AutoMocker.cs trunk/Source/StructureMap.AutoMocking/MoqFactory.cs trunk/Source/StructureMap.AutoMocking/RhinoAutoMocker.cs trunk/Source/StructureMap.AutoMocking/RhinoMockRepositoryProxy.cs trunk/Source/StructureMap.AutoMocking/ServiceLocator.cs trunk/Source/StructureMap.DebuggerVisualizers/ContainerDetail.cs trunk/Source/StructureMap.DebuggerVisualizers/ContainerForm.cs trunk/Source/StructureMap.DebuggerVisualizers/ContainerVisualizer.cs trunk/Source/StructureMap.DebuggerVisualizers/ContainerVisualizerObjectSource.cs trunk/Source/StructureMap.DebuggerVisualizers/DisplayHelper.cs trunk/Source/StructureMap.DebuggerVisualizers/Properties/AssemblyInfo.cs trunk/Source/StructureMap.DebuggerVisualizers.Testing/Program.cs trunk/Source/StructureMap.DebuggerVisualizers.Testing/Properties/AssemblyInfo.cs trunk/Source/StructureMap.DebuggerVisualizers.Testing/SampleTypes.cs trunk/Source/StructureMap.DebuggerVisualizers.Testing/VisualizerTests.cs trunk/Source/StructureMap.DeploymentTasks/AddAssembly.cs trunk/Source/StructureMap.DeploymentTasks/SetOverrideTask.cs trunk/Source/StructureMap.DeploymentTasks/SubstitutionTask.cs trunk/Source/StructureMap.DeploymentTasks/Versioning/CheckVersionTask.cs trunk/Source/StructureMap.DeploymentTasks/Versioning/DeployedDirectory.cs trunk/Source/StructureMap.DeploymentTasks/Versioning/DeployedFile.cs trunk/Source/StructureMap.DeploymentTasks/Versioning/DotNetAssembly.cs trunk/Source/StructureMap.DeploymentTasks/Versioning/GenerateVersionReport.cs trunk/Source/StructureMap.Testing/AutoMocking/MoqAutoMockerTester.cs trunk/Source/StructureMap.Testing/AutoWiringExamples.cs trunk/Source/StructureMap.Testing/Bugs/BuildUpBug.cs trunk/Source/StructureMap.Testing/Bugs/IDictionaryAndXmlBugTester.cs trunk/Source/StructureMap.Testing/Bugs/SingletonShouldBeLazy.cs trunk/Source/StructureMap.Testing/Bugs/SpecifyScopeInConfigureTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/AddInstanceTester.cs trunk/Source/StructureMap.Testing/Configuration/DictionaryAndArrayArgumentTester.cs trunk/Source/StructureMap.Testing/Diagnostics/DoctorTester.cs trunk/Source/StructureMap.Testing/Diagnostics/ValidationBuildSessionTester.cs trunk/Source/StructureMap.Testing/Examples/BuildUp.cs trunk/Source/StructureMap.Testing/Examples/Interception.cs trunk/Source/StructureMap.Testing/Examples/RegisteringWithTheAPI.cs trunk/Source/StructureMap.Testing/Examples.cs trunk/Source/StructureMap.Testing/GenericsAcceptanceTester.cs trunk/Source/StructureMap.Testing/GenericsIntegrationTester.cs trunk/Source/StructureMap.Testing/Graph/ArrayConstructorTester.cs trunk/Source/StructureMap.Testing/Graph/AssemblyScannerTester.cs trunk/Source/StructureMap.Testing/Graph/ContainerTester.cs trunk/Source/StructureMap.Testing/Graph/ConventionBasedSetterInjectionTester.cs trunk/Source/StructureMap.Testing/Graph/DefaultConventionScanningTester.cs trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs trunk/Source/StructureMap.Testing/Graph/FillDependenciesTester.cs trunk/Source/StructureMap.Testing/Graph/FullStackFacadeTester.cs trunk/Source/StructureMap.Testing/Graph/GenericsPluginGraphTester.cs trunk/Source/StructureMap.Testing/Graph/InstanceFactoryTester.cs trunk/Source/StructureMap.Testing/Graph/InstanceTarget.cs trunk/Source/StructureMap.Testing/Graph/Interceptors/CompoundInterceptorTester.cs trunk/Source/StructureMap.Testing/Graph/Interceptors/TypeInterceptionTester.cs trunk/Source/StructureMap.Testing/Graph/ParameterInfoCollection.cs trunk/Source/StructureMap.Testing/Graph/PluginFamilyTester.cs trunk/Source/StructureMap.Testing/Graph/PluginTester.cs trunk/Source/StructureMap.Testing/Graph/SetterInjectionEmittingTester.cs trunk/Source/StructureMap.Testing/Graph/SingleImplementationScannerTester.cs trunk/Source/StructureMap.Testing/Graph/Source/XmlMementoSourceTester.cs trunk/Source/StructureMap.Testing/Graph/TestExplicitArguments.cs trunk/Source/StructureMap.Testing/Graph/TypeFindingTester.cs trunk/Source/StructureMap.Testing/Graph/TypePathTester.cs trunk/Source/StructureMap.Testing/InstanceCacheTester.cs trunk/Source/StructureMap.Testing/InstanceMementoInstanceCreationTester.cs trunk/Source/StructureMap.Testing/MementoTester.cs trunk/Source/StructureMap.Testing/ModelQueryTester.cs trunk/Source/StructureMap.Testing/ObjectFactoryInitializeTester.cs trunk/Source/StructureMap.Testing/ObjectFactoryTester.cs trunk/Source/StructureMap.Testing/PerRequestInterceptorTester.cs trunk/Source/StructureMap.Testing/Pipeline/BuildStackTester.cs trunk/Source/StructureMap.Testing/Pipeline/BuildStrategiesTester.cs trunk/Source/StructureMap.Testing/Pipeline/ConditionalInstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/ConstructorInstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/ContainerDisposalTester.cs trunk/Source/StructureMap.Testing/Pipeline/ContainerIsInTheContainerTester.cs trunk/Source/StructureMap.Testing/Pipeline/DefaultInstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/EnumerableInstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/GenericsHelperExpressionTester.cs trunk/Source/StructureMap.Testing/Pipeline/HybridBuildLifecycleTester.cs trunk/Source/StructureMap.Testing/Pipeline/MissingInstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/NestedContainerSupportTester.cs trunk/Source/StructureMap.Testing/Pipeline/ObjectBuilderTester.cs trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs trunk/Source/StructureMap.Testing/Pipeline/ProfileManagerTester.cs trunk/Source/StructureMap.Testing/Pipeline/PrototypeInstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/RedirectTester.cs trunk/Source/StructureMap.Testing/Pipeline/RedirectingTester.cs trunk/Source/StructureMap.Testing/Pipeline/SmartInstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/StubBuildSession.cs trunk/Source/StructureMap.Testing/Pipeline/ThreadLocalStorageLifecycleTester.cs trunk/Source/StructureMap.Testing/PrimitiveArrayTester.cs trunk/Source/StructureMap.Testing/ReadingRegistriesFromXmlTester.cs trunk/Source/StructureMap.Testing/SpecificationExtensions.cs trunk/Source/StructureMap.Testing/StructureMapConfigurationTester.cs trunk/Source/StructureMap.Testing/TestData/DataMother.cs trunk/Source/StructureMap.Testing/TypeExtensionsTester.cs trunk/Source/StructureMap.Testing/Util/CacheTester.cs trunk/Source/StructureMap.Testing/XmlWriting/ElementChecker.cs trunk/Source/StructureMap.Testing.GenericWidgets/Widgets.cs trunk/Source/StructureMap.Testing.Widget/ArrayConstruction.cs trunk/Source/StructureMap.Testing.Widget/Columns.cs trunk/Source/StructureMap.Testing.Widget/Hierarchy.cs trunk/Source/StructureMap.Testing.Widget/IWidget.cs trunk/Source/StructureMap.Testing.Widget/Rule.cs trunk/Source/StructureMap.Testing.Widget/WidgetMaker.cs trunk/Source/StructureMap.Testing.Widget3/Gateways.cs trunk/Source/StructureMap.Testing.Widget3/IService.cs trunk/Source/StructureMap.Testing.Widget5/AutoFilledGridColumn.cs trunk/Source/StructureMap.Testing.Widget5/BasicGridColumn.cs trunk/Source/StructureMap.Testing.Widget5/CannotBeAutoFilledGridColumn.cs trunk/Source/StructureMap.Testing.Widget5/OtherGridColumn.cs trunk/Source/StructureMapDoctor/Program.cs trunk/Source/TableOfContentsBuilder/Program.cs trunk/Source/TableOfContentsBuilder/Properties/AssemblyInfo.cs Modified: trunk/Source/StructureMap/Attributes/PluggableAttribute.cs =================================================================== --- trunk/Source/StructureMap/Attributes/PluggableAttribute.cs 2009-12-26 05:37:13 UTC (rev 295) +++ trunk/Source/StructureMap/Attributes/PluggableAttribute.cs 2009-12-26 05:45:56 UTC (rev 296) @@ -26,7 +26,7 @@ /// <returns></returns> public static bool MarkedAsPluggable(Type objectType) { - PluggableAttribute att = GetCustomAttribute(objectType, typeof (PluggableAttribute), false) as PluggableAttribute; + var att = GetCustomAttribute(objectType, typeof (PluggableAttribute), false) as PluggableAttribute; return (att != null); } } Modified: trunk/Source/StructureMap/Attributes/PluginFamilyAttribute.cs =================================================================== --- trunk/Source/StructureMap/Attributes/PluginFamilyAttribute.cs 2009-12-26 05:37:13 UTC (rev 295) +++ trunk/Source/StructureMap/Attributes/PluginFamilyAttribute.cs 2009-12-26 05:45:56 UTC (rev 296) @@ -26,11 +26,7 @@ /// If set, determines the shared "scope" of the instance -- PerRequest, Singleton, ThreadLocal, /// HttpContext, etc. /// </summary> - public InstanceScope Scope - { - get { return _scope; } - set { _scope = value; } - } + public InstanceScope Scope { get { return _scope; } set { _scope = value; } } public Type SourceType { get; set; } @@ -38,20 +34,13 @@ /// InstanceKey of the default instance. Used to implicitly define the default without /// declaring the instance in StructureMap.config /// </summary> - public string DefaultKey - { - get { return _default; } - } + public string DefaultKey { get { return _default; } } /// <summary> /// Declares the target to be built by StructureMap as a Singleton. One object instance will /// be created for each named instance /// </summary> - public bool IsSingleton - { - get { return _scope == InstanceScope.Singleton; } - set { _scope = value ? InstanceScope.Singleton : InstanceScope.PerRequest; } - } + public bool IsSingleton { get { return _scope == InstanceScope.Singleton; } set { _scope = value ? InstanceScope.Singleton : InstanceScope.PerRequest; } } /// <summary> Modified: trunk/Source/StructureMap/BuildSession.cs =================================================================== --- trunk/Source/StructureMap/BuildSession.cs 2009-12-26 05:37:13 UTC (rev 295) +++ trunk/Source/StructureMap/BuildSession.cs 2009-12-26 05:45:56 UTC (rev 296) @@ -1,21 +1,20 @@ using System; -using System.Collections; using System.Collections.Generic; +using System.Linq; using StructureMap.Graph; using StructureMap.Interceptors; using StructureMap.Pipeline; using StructureMap.Util; -using System.Linq; namespace StructureMap { public class BuildSession : IContext { - protected BuildStack _buildStack = new BuildStack(); + private readonly ObjectBuilder _builder; private readonly InstanceCache _cache = new InstanceCache(); private readonly Cache<Type, Func<object>> _defaults; private readonly PipelineGraph _pipelineGraph; - private readonly ObjectBuilder _builder; + protected BuildStack _buildStack = new BuildStack(); public BuildSession(PipelineGraph pipelineGraph, InterceptorLibrary interceptorLibrary, IObjectCache cache) { @@ -45,28 +44,13 @@ { } - protected void clearBuildStack() - { - _buildStack = new BuildStack(); - } + protected PipelineGraph pipelineGraph { get { return _pipelineGraph; } } - protected PipelineGraph pipelineGraph - { - get { return _pipelineGraph; } - } - #region IContext Members - public string RequestedName - { - get; - set; - } + public string RequestedName { get; set; } - public BuildStack BuildStack - { - get { return _buildStack; } - } + public BuildStack BuildStack { get { return _buildStack; } } public Type ParentType { @@ -87,10 +71,7 @@ return (T) CreateInstance(typeof (T), name); } - BuildFrame IContext.Root - { - get { return _buildStack.Root; } - } + BuildFrame IContext.Root { get { return _buildStack.Root; } } public virtual void RegisterDefault(Type pluginType, object defaultObject) { @@ -122,9 +103,17 @@ return list; } + #endregion + public IEnumerable<T> GetAllInstances<T>() + { + return forType(typeof (T)).AllInstances.Select(x => GetInstance<T>()); + } - #endregion + protected void clearBuildStack() + { + _buildStack = new BuildStack(); + } public virtual object CreateInstance(Type pluginType, string name) { @@ -147,7 +136,7 @@ result = _builder.Resolve(pluginType, instance, this); // TODO: HACK ATTACK!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - var isUnique = forType(pluginType).Lifecycle is UniquePerRequestLifecycle; + bool isUnique = forType(pluginType).Lifecycle is UniquePerRequestLifecycle; if (!isUnique) { _cache.Set(pluginType, instance, result); @@ -176,11 +165,6 @@ return array; } - public IEnumerable<T> GetAllInstances<T>() - { - return forType(typeof (T)).AllInstances.Select(x => GetInstance<T>()); - } - public IEnumerable<object> GetAllInstances(Type pluginType) { return forType(pluginType).AllInstances.Select(x => CreateInstance(pluginType, x)); Modified: trunk/Source/StructureMap/CloseGenericTypeExpression.cs =================================================================== --- trunk/Source/StructureMap/CloseGenericTypeExpression.cs 2009-12-26 05:37:13 UTC (rev 295) +++ trunk/Source/StructureMap/CloseGenericTypeExpression.cs 2009-12-26 05:45:56 UTC (rev 296) @@ -15,10 +15,11 @@ IList<T> As<T>(); } - public class CloseGenericTypeExpression : OpenGenericTypeSpecificationExpression, OpenGenericTypeListSpecificationExpression + public class CloseGenericTypeExpression : OpenGenericTypeSpecificationExpression, + OpenGenericTypeListSpecificationExpression { + private readonly IContainer _container; private readonly object _subject; - private readonly IContainer _container; private Type _pluginType; public CloseGenericTypeExpression(object subject, IContainer container) @@ -27,7 +28,29 @@ _container = container; } + IList<T> OpenGenericTypeListSpecificationExpression.As<T>() + { + IList list = _container.With(_subject.GetType(), _subject).GetAllInstances(_pluginType); + var returnValue = new List<T>(); + foreach (object o in list) + { + returnValue.Add((T) o); + } + + return returnValue; + } + /// <summary> + /// specify what type you'd like the service returned as + /// </summary> + /// <typeparam name="T"></typeparam> + /// <returns></returns> + T OpenGenericTypeSpecificationExpression.As<T>() + { + return (T) _container.With(_subject.GetType(), _subject).GetInstance(_pluginType); + } + + /// <summary> /// Specify the open generic type that should have a single generic parameter /// </summary> /// <param name="type"></param> @@ -48,32 +71,10 @@ _pluginType = type.MakeGenericType(_subject.GetType()); } - /// <summary> - /// specify what type you'd like the service returned as - /// </summary> - /// <typeparam name="T"></typeparam> - /// <returns></returns> - T OpenGenericTypeSpecificationExpression.As<T>() - { - return (T) _container.With(_subject.GetType(), _subject).GetInstance(_pluginType); - } - public OpenGenericTypeListSpecificationExpression GetAllClosedTypesOf(Type type) { closeType(type); return this; } - - IList<T> OpenGenericTypeListSpecificationExpression.As<T>() - { - IList list = _container.With(_subject.GetType(), _subject).GetAllInstances(_pluginType); - var returnValue = new List<T>(); - foreach (var o in list) - { - returnValue.Add((T) o); - } - - return returnValue; - } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2009-12-26 05:37:13 UTC (rev 295) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2009-12-26 05:45:56 UTC (rev 296) @@ -33,18 +33,9 @@ /// <summary> /// Define the Default Instance for this PluginType /// </summary> - public IsExpression<PLUGINTYPE> TheDefault - { - get { return new InstanceExpression<PLUGINTYPE>(i => registerDefault(i)); } - } + public IsExpression<PLUGINTYPE> TheDefault { get { return new InstanceExpression<PLUGINTYPE>(i => registerDefault(i)); } } - public InstanceExpression<PLUGINTYPE> MissingNamedInstanceIs - { - get - { - return new InstanceExpression<PLUGINTYPE>(i => _alterations.Add(family => family.MissingInstance = i)); - } - } + public InstanceExpression<PLUGINTYPE> MissingNamedInstanceIs { get { return new InstanceExpression<PLUGINTYPE>(i => _alterations.Add(family => family.MissingInstance = i)); } } /// <summary> /// Add multiple Instance's to this PluginType @@ -93,7 +84,7 @@ { throw new StructureMapException(231); } - + return alterAndContinue(family => { ConfiguredInstance instance = @@ -113,9 +104,9 @@ // 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; } @@ -223,7 +214,8 @@ _children.Add( graph => { - var typeInterceptor = new PluginTypeInterceptor(typeof(PLUGINTYPE), (c, o) => interceptor.Process(o, c)); + var typeInterceptor = new PluginTypeInterceptor(typeof (PLUGINTYPE), + (c, o) => interceptor.Process(o, c)); graph.InterceptorLibrary.AddInterceptor(typeInterceptor); }); @@ -243,11 +235,11 @@ { Func<IContext, object, object> function = (c, o) => { - handler(c, (PLUGINTYPE)o); + handler(c, (PLUGINTYPE) o); return o; }; - var interceptor = new PluginTypeInterceptor(typeof(PLUGINTYPE), function); + var interceptor = new PluginTypeInterceptor(typeof (PLUGINTYPE), function); graph.InterceptorLibrary.AddInterceptor(interceptor); }); @@ -290,7 +282,8 @@ _children.Add( graph => { - var interceptor = new PluginTypeInterceptor(typeof(PLUGINTYPE), (c, o) => handler(c, (PLUGINTYPE)o)); + var interceptor = new PluginTypeInterceptor(typeof (PLUGINTYPE), + (c, o) => handler(c, (PLUGINTYPE) o)); graph.InterceptorLibrary.AddInterceptor(interceptor); }); @@ -306,7 +299,7 @@ /// <returns></returns> public CreatePluginFamilyExpression<PLUGINTYPE> AddConcreteType<PLUGGEDTYPE>() { - if (!PluginCache.GetPlugin(typeof(PLUGGEDTYPE)).CanBeAutoFilled) + if (!PluginCache.GetPlugin(typeof (PLUGGEDTYPE)).CanBeAutoFilled) { throw new StructureMapException(231); } @@ -363,7 +356,7 @@ /// <returns></returns> public CreatePluginFamilyExpression<PLUGINTYPE> AlwaysUnique() { - return this.LifecycleIs(new UniquePerRequestLifecycle()); + return LifecycleIs(new UniquePerRequestLifecycle()); } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs 2009-12-26 05:37:13 UTC (rev 295) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs 2009-12-26 05:45:56 UTC (rev 296) @@ -80,7 +80,7 @@ return instance; } - + /// <summary> /// Shortcut method to add an additional Instance to this Plugin Type /// as just a Concrete Type. This will only work if the Concrete Type Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs 2009-12-26 05:37:13 UTC (rev 295) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs 2009-12-26 05:45:56 UTC (rev 296) @@ -166,7 +166,7 @@ /// <param name="template"></param> /// <returns></returns> SerializedInstance SerializedCopyOf(T template); - + /// <summary> /// Creates an Instance that will load an ASCX user control from the url /// </summary> @@ -183,7 +183,7 @@ ConditionalInstance<T> Conditional(Action<ConditionalInstance<T>.ConditionalInstanceExpression> configuration); } - public class InstanceExpression<T> : IInstanceExpression<T>, ThenItExpression<T> + public class InstanceExpression<T> : IInstanceExpression<T>, ThenItExpression<T> { private readonly Action<Instance> _action; @@ -194,10 +194,7 @@ #region IsExpression<T> Members - IInstanceExpression<T> IsExpression<T>.Is - { - get { return this; } - } + IInstanceExpression<T> IsExpression<T>.Is { get { return this; } } public void IsThis(Instance instance) { @@ -216,12 +213,6 @@ _action(instance); } - private INSTANCE returnInstance<INSTANCE>(INSTANCE instance) where INSTANCE : Instance - { - Instance(instance); - return instance; - } - public SmartInstance<PLUGGEDTYPE> OfConcreteType<PLUGGEDTYPE>() where PLUGGEDTYPE : T { return returnInstance(new SmartInstance<PLUGGEDTYPE>()); @@ -272,15 +263,19 @@ return returnInstance(new UserControlInstance(url)); } - public ConditionalInstance<T> Conditional(Action<ConditionalInstance<T>.ConditionalInstanceExpression> configuration) + public ConditionalInstance<T> Conditional( + Action<ConditionalInstance<T>.ConditionalInstanceExpression> configuration) { return returnInstance(new ConditionalInstance<T>(configuration)); } - IsExpression<T> ThenItExpression<T>.ThenIt + IsExpression<T> ThenItExpression<T>.ThenIt { get { return this; } } + + private INSTANCE returnInstance<INSTANCE>(INSTANCE instance) where INSTANCE : Instance { - get { return this; } + Instance(instance); + return instance; } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/ProfileExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/ProfileExpression.cs 2009-12-26 05:37:13 UTC (rev 295) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/ProfileExpression.cs 2009-12-26 05:45:56 UTC (rev 296) @@ -3,8 +3,6 @@ namespace StructureMap.Configuration.DSL.Expressions { - - /// <summary> /// Expression class to help define a runtime Profile /// </summary> @@ -39,13 +37,9 @@ /// <returns></returns> public IsExpression<T> Type<T>() { - return new InstanceExpression<T>(instance => - { - _registry.addExpression(graph => - { - graph.SetDefault(_profileName, typeof(T), instance); - }); - }); + return + new InstanceExpression<T>( + instance => { _registry.addExpression(graph => { graph.SetDefault(_profileName, typeof (T), instance); }); }); } /// <summary> @@ -117,7 +111,6 @@ #region Nested type: InstanceDefaultExpression - /// <summary> /// Expression Builder within defining a Profile /// </summary> @@ -194,7 +187,6 @@ var instance = new ConfiguredInstance(typeof (CONCRETETYPE)); return Use(instance); } - } #endregion Modified: trunk/Source/StructureMap/Configuration/DSL/Registry.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2009-12-26 05:37:13 UTC (rev 295) +++ trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2009-12-26 05:45:56 UTC (rev 296) @@ -8,8 +8,6 @@ namespace StructureMap.Configuration.DSL { - - /// <summary> /// A Registry class provides methods and grammars for configuring a Container or ObjectFactory. /// Using a Registry subclass is the recommended way of configuring a StructureMap Container. @@ -203,7 +201,7 @@ internal static bool IsPublicRegistry(Type type) { - if (type.Assembly == typeof(Registry).Assembly) + if (type.Assembly == typeof (Registry).Assembly) { return false; } @@ -295,30 +293,7 @@ return ForRequestedType<PLUGINTYPE>(); } - #region Nested type: BuildWithExpression - /// <summary> - /// Define the constructor and setter arguments for the default T - /// </summary> - /// <typeparam name="T"></typeparam> - public class BuildWithExpression<T> - { - private readonly SmartInstance<T> _instance; - - public BuildWithExpression(SmartInstance<T> instance) - { - _instance = instance; - } - - public SmartInstance<T> Configure - { - get { return _instance; } - } - } - - #endregion - - /// <summary> /// Creates automatic "policies" for which public setters are considered mandatory /// properties by StructureMap that will be "setter injected" as part of the /// construction process. @@ -337,7 +312,7 @@ /// <param name="expression"></param> public void SelectConstructor<T>(Expression<Func<T>> expression) { - PluginCache.GetPlugin(typeof(T)).UseConstructor(expression); + PluginCache.GetPlugin(typeof (T)).UseConstructor(expression); } public void Forward<FROM, TO>() where FROM : class where TO : class @@ -401,10 +376,32 @@ { var raw = c.GetInstance<U>(); var t = raw as T; - if (t == null) throw new ApplicationException(raw.GetType().AssemblyQualifiedName + " could not be cast to " + typeof(T).AssemblyQualifiedName); + if (t == null) + throw new ApplicationException(raw.GetType().AssemblyQualifiedName + " could not be cast to " + + typeof (T).AssemblyQualifiedName); return t; - }); + }); } + + #region Nested type: BuildWithExpression + + /// <summary> + /// Define the constructor and setter arguments for the default T + /// </summary> + /// <typeparam name="T"></typeparam> + public class BuildWithExpression<T> + { + private readonly SmartInstance<T> _instance; + + public BuildWithExpression(SmartInstance<T> instance) + { + _instance = instance; + } + + public SmartInstance<T> Configure { get { return _instance; } } + } + + #endregion } } \ No newline at end of file Modified: trunk/Source/StructureMap/Configuration/DSL/SetterConvention.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/SetterConvention.cs 2009-12-26 05:37:13 UTC (rev 295) +++ trunk/Source/StructureMap/Configuration/DSL/SetterConvention.cs 2009-12-26 05:45:56 UTC (rev 296) @@ -1,7 +1,6 @@ using System; using System.Reflection; using StructureMap.Graph; -using StructureMap; using StructureMap.TypeRules; namespace StructureMap.Configuration.DSL @@ -20,7 +19,7 @@ { Matching(prop => prop.PropertyType == typeof (T)); } - + /// <summary> /// Directs StructureMap to tread all public setters with /// a PropertyType that matches the predicate as a @@ -59,7 +58,7 @@ /// <typeparam name="T"></typeparam> public void WithAnyTypeFromNamespaceContainingType<T>() { - WithAnyTypeFromNamespace(typeof(T).Namespace); + WithAnyTypeFromNamespace(typeof (T).Namespace); } /// <summary> Modified: trunk/Source/StructureMap/Configuration/GraphBuilder.cs =================================================================== --- trunk/Source/StructureMap/Configuration/GraphBuilder.cs 2009-12-26 05:37:13 UTC (rev 295) +++ trunk/Source/StructureMap/Configuration/GraphBuilder.cs 2009-12-26 05:45:56 UTC (rev 296) @@ -14,7 +14,8 @@ private readonly PluginGraph _systemGraph; - public GraphBuilder(Registry[] registries) : this(registries, new PluginGraph()) + public GraphBuilder(Registry[] registries) + : this(registries, new PluginGraph()) { } @@ -40,10 +41,7 @@ _pluginGraph.Seal(); } - public PluginGraph PluginGraph - { - get { return _pluginGraph; } - } + public PluginGraph PluginGraph { get { return _pluginGraph; } } public void AddAssembly(string assemblyName) { @@ -60,10 +58,10 @@ public void AddRegistry(string registryTypeName) { - _pluginGraph.Log.Try(()=> + _pluginGraph.Log.Try(() => { - var type = new TypePath(registryTypeName).FindType(); - Registry registry = (Registry) Activator.CreateInstance(type); + Type type = new TypePath(registryTypeName).FindType(); + var registry = (Registry) Activator.CreateInstance(type); registry.ConfigurePluginGraph(_pluginGraph); }).AndReportErrorAs(290, registryTypeName); } Modified: trunk/Source/StructureMap/Configuration/XmlConstants.cs =================================================================== --- trunk/Source/StructureMap/Configuration/XmlConstants.cs 2009-12-26 05:37:13 UTC (rev 295) +++ trunk/Source/StructureMap/Configuration/XmlConstants.cs 2009-12-26 05:45:56 UTC (rev 296) @@ -29,9 +29,9 @@ public const string PLUGIN_NODE = "Plugin"; public const string PLUGIN_TYPE = "PluginType"; public const string PROFILE_NODE = "Profile"; + public const string REGISTRY = "Registry"; public const string SCOPE = "Scope"; public const string STRUCTUREMAP = "StructureMap"; public const string TYPE_ATTRIBUTE = "Type"; - public const string REGISTRY = "Registry"; } } \ No newline at end of file Modified: trunk/Source/StructureMap/ConfigurationExpression.cs =================================================================== --- trunk/Source/StructureMap/ConfigurationExpression.cs 2009-12-26 05:37:13 UTC (rev 295) +++ trunk/Source/StructureMap/ConfigurationExpression.cs 2009-12-26 05:45:56 UTC (rev 296) @@ -1,6 +1,4 @@ -using System; using System.Collections.Generic; -using System.Linq.Expressions; using System.Xml; using StructureMap.Configuration; using StructureMap.Configuration.DSL; @@ -33,10 +31,7 @@ /// If true, directs StructureMap to look for configuration in the App.config. /// The default value is false. /// </summary> - public bool IncludeConfigurationFromConfigFile - { - set { _parserBuilder.UseAndEnforceExistenceOfDefaultFile = value; } - } + public bool IncludeConfigurationFromConfigFile { set { _parserBuilder.UseAndEnforceExistenceOfDefaultFile = value; } } /// <summary> /// Creates and adds a Registry object of type T. @@ -85,11 +80,5 @@ return builder.Build(); } - - } - - - - } \ No newline at end of file Modified: trunk/Source/StructureMap/Construction/InstanceBuilder.cs =================================================================== --- trunk/Source/StructureMap/Construction/InstanceBuilder.cs 2009-12-26 05:37:13 UTC (rev 295) +++ trunk/Source/StructureMap/Construction/InstanceBuilder.cs 2009-12-26 05:45:56 UTC (rev 296) @@ -1,5 +1,4 @@ using System; -using StructureMap.Pipeline; namespace StructureMap.Construction { @@ -16,22 +15,19 @@ /// </summary> public class InstanceBuilder : IInstanceBuilder { - private readonly Type _pluggedType; - private readonly Func<IArguments, object> _constructor; private readonly Action<IArguments, object> _buildUp; + private readonly Func<IArguments, object> _constructor; + private readonly Type _pluggedType; - public InstanceBuilder(Type pluggedType, Func<IArguments, object> constructor, Action<IArguments, object> buildUp) + public InstanceBuilder(Type pluggedType, Func<IArguments, object> constructor, + Action<IArguments, object> buildUp) { _pluggedType = pluggedType; _constructor = constructor; _buildUp = buildUp; } - public Type PluggedType { get - { - return _pluggedType; - } - } + public Type PluggedType { get { return _pluggedType; } } public virtual object BuildInstance(IArguments args) { Modified: trunk/Source/StructureMap/Container.cs =================================================================== --- trunk/Source/StructureMap/Container.cs 2009-12-26 05:37:13 UTC (rev 295) +++ trunk/Source/StructureMap/Container.cs 2009-12-26 05:45:56 UTC (rev 296) @@ -145,7 +145,6 @@ } - /// <summary> /// Creates or finds the default instance of type T /// </summary> @@ -163,7 +162,6 @@ } - /// <summary> /// Creates or resolves all registered instances of type T /// </summary> @@ -302,7 +300,6 @@ } - /// <summary> /// Creates or resolves all registered instances of the pluginType /// </summary> @@ -475,6 +472,55 @@ #endregion + /// <summary> + /// Injects the given object into a Container by name for the designated + /// pluginType. Mostly used for temporarily setting up return values of the Container + /// to introduce mocks or stubs during automated testing scenarios + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="name"></param> + /// <param name="object"></param> + public void Inject<T>(string name, T @object) + { + ObjectInstance instance = new ObjectInstance(@object).WithName(name); + _transientCache.Set(typeof (T), instance, @object); + _pipelineGraph.AddInstance<T>(instance); + } + + /// <summary> + /// Injects the given object into a Container as the default for the designated + /// pluginType. Mostly used for temporarily setting up return values of the Container + /// to introduce mocks or stubs during automated testing scenarios + /// </summary> + /// <param name="pluginType"></param> + /// <param name="object"></param> + public void Inject(Type pluginType, object @object) + { + if (!@object.GetType().CanBeCastTo(pluginType)) + { + throw new StructureMapException(220, pluginType.FullName, + @object.GetType().FullName); + } + + + var instance = new ObjectInstance(@object); + _transientCache.Set(pluginType, instance, @object); + _pipelineGraph.SetDefault(pluginType, instance); + } + + /// <summary> + /// Injects the given object into a Container as the default for the designated + /// PLUGINTYPE. Mostly used for temporarily setting up return values of the Container + /// to introduce mocks or stubs during automated testing scenarios + /// </summary> + /// <typeparam name="PLUGINTYPE"></typeparam> + /// <param name="object"></param> + public void Inject<PLUGINTYPE>(PLUGINTYPE @object) + { + Instance instance = _pipelineGraph.Inject(@object); + _transientCache.Set(typeof (PLUGINTYPE), instance, @object); + } + private object buildInstanceWithArgs(Type pluginType, Instance defaultInstance, ExplicitArguments args, string requestedName) { @@ -534,7 +580,6 @@ } - private BuildSession withNewSession(string name) { return new BuildSession(_pipelineGraph, _interceptorLibrary, _transientCache) @@ -543,6 +588,16 @@ }; } + /// <summary> + /// Sets the default instance for the PluginType + /// </summary> + /// <param name="pluginType"></param> + /// <param name="instance"></param> + public void Inject(Type pluginType, Instance instance) + { + _pipelineGraph.SetDefault(pluginType, instance); + } + #region Nested type: GetInstanceAsExpression public interface GetInstanceAsExpression @@ -588,65 +643,5 @@ } #endregion - - - /// <summary> - /// Injects the given object into a Container by name for the designated - /// pluginType. Mostly used for temporarily setting up return values of the Container - /// to introduce mocks or stubs during automated testing scenarios - /// </summary> - /// <typeparam name="T"></typeparam> - /// <param name="name"></param> - /// <param name="object"></param> - public void Inject<T>(string name, T @object) - { - ObjectInstance instance = new ObjectInstance(@object).WithName(name); - _transientCache.Set(typeof(T), instance, @object); - _pipelineGraph.AddInstance<T>(instance); - } - - /// <summary> - /// Sets the default instance for the PluginType - /// </summary> - /// <param name="pluginType"></param> - /// <param name="instance"></param> - public void Inject(Type pluginType, Instance instance) - { - _pipelineGraph.SetDefault(pluginType, instance); - } - - /// <summary> - /// Injects the given object into a Container as the default for the designated - /// pluginType. Mostly used for temporarily setting up return values of the Container - /// to introduce mocks or stubs during automated testing scenarios - /// </summary> - /// <param name="pluginType"></param> - /// <param name="object"></param> - public void Inject(Type pluginType, object @object) - { - if (!@object.GetType().CanBeCastTo(pluginType)) - { - throw new StructureMapException(220, pluginType.FullName, - @object.GetType().FullName); - } - - - var instance = new ObjectInstance(@object); - _transientCache.Set(pluginType, instance, @object); - _pipelineGraph.SetDefault(pluginType, instance); - } - - /// <summary> - /// Injects the given object into a Container as the default for the designated - /// PLUGINTYPE. Mostly used for temporarily setting up return values of the Container - /// to introduce mocks or stubs during automated testing scenarios - /// </summary> - /// <typeparam name="PLUGINTYPE"></typeparam> - /// <param name="object"></param> - public void Inject<PLUGINTYPE>(PLUGINTYPE @object) - { - var instance = _pipelineGraph.Inject(@object); - _transientCache.Set(typeof(PLUGINTYPE), instance, @object); - } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Diagnostics/Doctor.cs =================================================================== --- trunk/Source/StructureMap/Diagnostics/Doctor.cs 2009-12-26 05:37:13 UTC (rev 295) +++ trunk/Source/StructureMap/Diagnostics/Doctor.cs 2009-12-26 05:45:56 UTC (rev 296) @@ -21,7 +21,11 @@ try { - var setup = new AppDomainSetup {ApplicationBase = BinaryPath, ConfigurationFile = ConfigFile}; + var setup = new AppDomainSetup + { + ApplicationBase = BinaryPath, + ConfigurationFile = ConfigFile + }; if (BinaryPath != null) setup.PrivateBinPath = BinaryPath; domain = AppDomain.CreateDomain("StructureMap-Diagnostics", null, setup); var doctor = Modified: trunk/Source/StructureMap/Diagnostics/GraphLog.cs =================================================================== --- trunk/Source/StructureMap/Diagnostics/GraphLog.cs 2009-12-26 05:37:13 UTC (rev 295) +++ trunk/Source/StructureMap/Diagnostics/GraphLog.cs 2009-12-26 05:45:56 UTC (rev 296) @@ -14,15 +14,9 @@ private readonly List<string> _sources = new List<string>(); private string _currentSource; - public int ErrorCount - { - get { return _errors.Count; } - } + public int ErrorCount { get { return _errors.Count; } } - public string[] Sources - { - get { return _sources.ToArray(); } - } + public string[] Sources { get { return _sources.ToArray(); } } public void StartSource(string description) { Modified: trunk/Source/StructureMap/Diagnostics/InstanceToken.cs =================================================================== --- trunk/Source/StructureMap/Diagnostics/InstanceToken.cs 2009-12-26 05:37:13 UTC (rev 295) +++ trunk/Source/StructureMap/Diagnostics/InstanceToken.cs 2009-12-26 05:45:56 UTC (rev 296) @@ -14,15 +14,9 @@ } - public string Name - { - get { return _name; } - } + public string Name { get { return _name; } } - public string Description - { - get { return _description; } - } + public string Description { get { return _description; } } #region IEquatable<InstanceToken> Members Modified: trunk/Source/StructureMap/Exceptions/StructureMapException.cs =================================================================== --- trunk/Source/StructureMap/Exceptions/StructureMapException.cs 2009-12-26 05:37:13 UTC (rev 295) +++ trunk/Source/StructureMap/Exceptions/StructureMapException.cs 2009-12-26 05:45:56 UTC (rev 296) @@ -14,8 +14,9 @@ private readonly string _msg; - protected StructureMapException(SerializationInfo info, StreamingContext context) : - base(info, context) + protected StructureMapException(SerializationInfo info, StreamingContext context) + : + base(info, context) { _errorCode = info.GetInt32("errorCode"); _msg = info.GetString("msg"); @@ -37,15 +38,9 @@ _msg += ErrorMessages.GetMessage(ErrorCode, args); } - public override string Message - { - get { return _msg; } - } + public override string Message { get { return _msg; } } - public int ErrorCode - { - get { return _errorCode; } - } + public int ErrorCode { get { return _errorCode; } } public override void GetObjectData(SerializationInfo info, StreamingContext context) Modified: trunk/Source/StructureMap/ExplicitArgsExpression.cs =================================================================== --- trunk/Source/StructureMap/ExplicitArgsExpression.cs 2009-12-26 05:37:13 UTC (rev 295) +++ trunk/Source/StructureMap/ExplicitArgsExpression.cs 2009-12-26 05:45:56 UTC (rev 296) @@ -116,6 +116,5 @@ { return _container.GetAllInstances(type, _args); } - } } \ No newline at end of file Modified: trunk/Source/StructureMap/Extensions.cs =================================================================== --- trunk/Source/StructureMap/Extensions.cs 2009-12-26 05:37:13 UTC (rev 295) +++ trunk/Source/StructureMap/Extensions.cs 2009-12-26 05:45:56 UTC (rev 296) @@ -1,7 +1,5 @@ -using System; +using System; using System.Collections.Generic; -using System.Linq; -using System.Text; namespace StructureMap { @@ -33,4 +31,4 @@ return array; } } -} +} \ No newline at end of file Modified: trunk/Source/StructureMap/Graph/AssemblyScanner.cs =================================================================== --- trunk/Source/StructureMap/Graph/AssemblyScanner.cs 2009-12-26 05:37:13 UTC (rev 295) +++ trunk/Source/StructureMap/Graph/AssemblyScanner.cs 2009-12-26 05:45:56 UTC (rev 296) @@ -47,7 +47,7 @@ /// </summary> /// <param name="path"></param> void AssembliesFromPath(string path); - + /// <summary> /// Sweep the designated path and add any Assembly's found in this folder to the /// scanning operation. The assemblyFilter can be used to filter or limit the @@ -72,8 +72,6 @@ #endregion - // ... Other methods - #region Adding TypeScanners /// <summary> @@ -83,6 +81,7 @@ void With(ITypeScanner scanner); void With(IHeavyweightTypeScanner heavyweightScanner); + /// <summary> /// Adds the DefaultConventionScanner to the scanning operations. I.e., a concrete /// class named "Something" that implements "ISomething" will be automatically @@ -173,8 +172,11 @@ void ExcludeType<T>(); // ... Other methods + #endregion + // ... Other methods + /// <summary> /// Scans for PluginType's and Concrete Types that close the given open generic type /// </summary> @@ -189,9 +191,9 @@ { private readonly List<Assembly> _assemblies = new List<Assembly>(); private readonly List<Predicate<Type>> _excludes = new List<Predicate<Type>>(); + private readonly List<IHeavyweightTypeScanner> _heavyweightScanners = new List<IHeavyweightTypeScanner>(); private readonly List<Predicate<Type>> _includes = new List<Predicate<Type>>(); private readonly List<ITypeScanner> _scanners = new List<ITypeScanner>(); - private readonly List<IHeavyweightTypeScanner> _heavyweightScanners = new List<IHeavyweightTypeScanner>(); public AssemblyScanner() { @@ -199,81 +201,9 @@ With<PluggableAttributeScanner>(); } - public int Count - { - get { return _assemblies.Count; } - } + public int Count { get { return _assemblies.Count; } } - internal void ScanForAll(PluginGraph pluginGraph) - { - var heavyweightScan = configureHeavyweightScan(); - - _assemblies.ForEach(assem => scanTypesInAssembly(assem, pluginGraph)); - - performHeavyweightScan(pluginGraph, heavyweightScan); - } - - private void scanTypesInAssembly(Assembly assembly, PluginGraph graph) - { - try - { - foreach (var type in assembly.GetExportedTypes()) - { - if (!isInTheIncludes(type)) continue; - if (isInTheExcludes(type)) continue; - - _scanners.ForEach(scanner => scanner.Process(type, graph)); - } - } - catch (Exception ex) - { - graph.Log.RegisterError(170, ex, assembly.FullName); - } - } - - private TypeMapBuilder configureHeavyweightScan() - { - var typeMapBuilder = new TypeMapBuilder(); - if (_heavyweightScanners.Count > 0) - { - With(typeMapBuilder); - } - return typeMapBuilder; - } - - private void performHeavyweightScan(PluginGraph pluginGraph, TypeMapBuilder typeMapBuilder) - { - var typeMaps = typeMapBuilder.GetTypeMaps(); - _heavyweightScanners.ForEach(scanner => scanner.Process(pluginGraph, typeMaps)); - typeMapBuilder.Dispose(); - } - - private bool isInTheExcludes(Type type) - { - if (_excludes.Count == 0) return false; - - foreach (var exclude in _excludes) - { - if (exclude(type)) return true; - } - - return false; - } - - private bool isInTheIncludes(Type type) - { - if (_includes.Count == 0) return true; - - - foreach (var include in _includes) - { - if (include(type)) return true; - } - - return false; - } - public void Assembly(Assembly assembly) { if (!_assemblies.Contains(assembly)) @@ -287,26 +217,13 @@ Assembly(AppDomain.CurrentDomain.Load(assemblyName)); } - public bool Contains(string assemblyName) - { - foreach (Assembly assembly in _assemblies) - { - if (assembly.GetName().Name == assemblyName) - { - return true; - } - } - - return false; - } - public void With(ITypeScanner scanner) { if (_scanners.Contains(scanner)) return; _scanners.Add(scanner); } - + public void With(IHeavyweightTypeScanner heavyweightScanner) { if (_heavyweightScanners.Contains(heavyweightScanner)) return; @@ -345,25 +262,6 @@ } } - private static Assembly findTheCallingAssembly() - { - var trace = new StackTrace(false); - - Assembly thisAssembly = System.Reflection.Assembly.GetExecutingAssembly(); - Assembly callingAssembly = null; - for (int i = 0; i < trace.FrameCount; i++) - { - StackFrame frame = trace.GetFrame(i); - Assembly assembly = frame.GetMethod().DeclaringType.Assembly; - if (assembly != thisAssembly) - { - callingAssembly = assembly; - break; - } - } - return callingAssembly; - } - public void AssemblyContainingType<T>() { _assemblies.Add(typeof (T).Assembly); @@ -441,16 +339,14 @@ public void AssembliesFromApplicationBaseDirectory(Predicate<Assembly> assemblyFilter) { - var baseDirectory = AppDomain.CurrentDomain.BaseDirectory; + string baseDirectory = AppDomain.CurrentDomain.BaseDirectory; AssembliesFromPath(baseDirectory, assemblyFilter); - var binPath = AppDomain.CurrentDomain.SetupInformation.PrivateBinPath; + string binPath = AppDomain.CurrentDomain.SetupInformation.PrivateBinPath; if (Directory.Exists(binPath)) { AssembliesFromPath(binPath, assemblyFilter); } - - } public void AssembliesFromPath(string path) @@ -460,14 +356,16 @@ public void AssembliesFromPath(string path, Predicate<Assembly> assemblyFilter) { - var assemblyPaths = System.IO.Directory.GetFiles(path).Where(file => - System.IO.Path.GetExtension(file).Equals( - ".exe", StringComparison.OrdinalIgnoreCase) - || - System.IO.Path.GetExtension(file).Equals( - ".dll", StringComparison.OrdinalIgnoreCase)); + IEnumerable<string> assemblyPaths = Directory.GetFiles(path).Where(file => + Path.GetExtension(file).Equals( + ".exe", + StringComparison.OrdinalIgnoreCase) + || + Path.GetExtension(file).Equals( + ".dll", + StringComparison.OrdinalIgnoreCase)); - foreach (var assemblyPath in assemblyPaths) + foreach (string assemblyPath in assemblyPaths) { ... [truncated message content] |
From: <jer...@us...> - 2009-12-26 05:37:20
|
Revision: 295 http://structuremap.svn.sourceforge.net/structuremap/?rev=295&view=rev Author: jeremydmiller Date: 2009-12-26 05:37:13 +0000 (Sat, 26 Dec 2009) Log Message: ----------- The big, big, big switch from IL generation to dynamic Func's. Ding dong, the witch is dead. Modified Paths: -------------- trunk/Source/StructureMap/BuildSession.cs trunk/Source/StructureMap/Container.cs trunk/Source/StructureMap/IContext.cs trunk/Source/StructureMap/InstanceMemento.cs trunk/Source/StructureMap/PipelineGraph.cs trunk/Source/StructureMap/StructureMap.csproj trunk/Source/StructureMap/TypeExtensions.cs Removed Paths: ------------- trunk/Source/StructureMap/InstanceBuilder.cs trunk/Source/StructureMap/InstanceBuilderList.cs trunk/Source/StructureMap/InstanceFamily.cs Modified: trunk/Source/StructureMap/BuildSession.cs =================================================================== --- trunk/Source/StructureMap/BuildSession.cs 2009-12-26 05:36:53 UTC (rev 294) +++ trunk/Source/StructureMap/BuildSession.cs 2009-12-26 05:37:13 UTC (rev 295) @@ -1,9 +1,11 @@ using System; +using System.Collections; using System.Collections.Generic; using StructureMap.Graph; using StructureMap.Interceptors; using StructureMap.Pipeline; using StructureMap.Util; +using System.Linq; namespace StructureMap { @@ -75,7 +77,7 @@ } } - T IContext.GetInstance<T>() + public T GetInstance<T>() { return (T) CreateInstance(typeof (T)); } @@ -120,6 +122,8 @@ return list; } + + #endregion public virtual object CreateInstance(Type pluginType, string name) @@ -172,6 +176,16 @@ return array; } + public IEnumerable<T> GetAllInstances<T>() + { + return forType(typeof (T)).AllInstances.Select(x => GetInstance<T>()); + } + + public IEnumerable<object> GetAllInstances(Type pluginType) + { + return forType(pluginType).AllInstances.Select(x => CreateInstance(pluginType, x)); + } + public virtual object CreateInstance(Type pluginType) { return _defaults[pluginType](); Modified: trunk/Source/StructureMap/Container.cs =================================================================== --- trunk/Source/StructureMap/Container.cs 2009-12-26 05:36:53 UTC (rev 294) +++ trunk/Source/StructureMap/Container.cs 2009-12-26 05:37:13 UTC (rev 295) @@ -2,6 +2,7 @@ using System.Collections; using System.Collections.Generic; using StructureMap.Configuration.DSL; +using StructureMap.Construction; using StructureMap.Diagnostics; using StructureMap.Exceptions; using StructureMap.Graph; @@ -241,8 +242,9 @@ IConfiguredInstance instance = _pipelineGraph.GetDefault(pluggedType) as IConfiguredInstance ?? new ConfiguredInstance(pluggedType); - InstanceBuilder builder = PluginCache.FindBuilder(pluggedType); - builder.BuildUp(instance, withNewSession(Plugin.DEFAULT), target); + IInstanceBuilder builder = PluginCache.FindBuilder(pluggedType); + var arguments = new Arguments(instance, withNewSession(Plugin.DEFAULT)); + builder.BuildUp(arguments, target); } /// <summary> @@ -481,11 +483,11 @@ defaultInstance = new ConfiguredInstance(pluginType); } - var basicInstance = defaultInstance as BasicInstance; + var basicInstance = defaultInstance as ConstructorInstance; Instance instance = basicInstance == null ? defaultInstance - : new ExplicitInstance(pluginType, args, basicInstance); + : basicInstance.Override(args); BuildSession session = withNewSession(requestedName); @@ -516,11 +518,10 @@ _pipelineGraph = new PipelineGraph(pluginGraph); - PluginCache.Compile(); - _pipelineGraph.Inject<IContainer>(this); } + [Obsolete("delegate to something cleaner in BuildSession")] private IList<T> getListOfTypeWithSession<T>(BuildSession session) { var list = new List<T>(); Modified: trunk/Source/StructureMap/IContext.cs =================================================================== --- trunk/Source/StructureMap/IContext.cs 2009-12-26 05:36:53 UTC (rev 294) +++ trunk/Source/StructureMap/IContext.cs 2009-12-26 05:37:13 UTC (rev 295) @@ -67,10 +67,18 @@ /// <summary> /// Gets all objects in the current object graph that can be cast - /// to T + /// to T that have already been created /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> IEnumerable<T> All<T>() where T : class; + + + /// <summary> + /// Creates/Resolves every configured instance of PlutinType T + /// </summary> + /// <typeparam name="T"></typeparam> + /// <returns></returns> + IEnumerable<T> GetAllInstances<T>(); } } \ No newline at end of file Deleted: trunk/Source/StructureMap/InstanceBuilder.cs =================================================================== --- trunk/Source/StructureMap/InstanceBuilder.cs 2009-12-26 05:36:53 UTC (rev 294) +++ trunk/Source/StructureMap/InstanceBuilder.cs 2009-12-26 05:37:13 UTC (rev 295) @@ -1,25 +0,0 @@ -using System; -using StructureMap.Pipeline; - -namespace StructureMap -{ -#pragma warning disable 169 - /// <summary> - /// Base class for creating an object instance from an InstanceMemento. SubClasses are - /// emitted for each concrete Plugin with constructor parameters. - /// </summary> - public abstract class InstanceBuilder - { - private Container _manager; - - // DO NOT ELIMINATE THIS METHOD - public InstanceBuilder(){} - - public abstract Type PluggedType { get; } - - public abstract object BuildInstance(IConfiguredInstance instance, BuildSession session); - - public virtual void BuildUp(IConfiguredInstance instance, BuildSession session, object target) { } - } -#pragma warning restore 169 -} \ No newline at end of file Deleted: trunk/Source/StructureMap/InstanceBuilderList.cs =================================================================== --- trunk/Source/StructureMap/InstanceBuilderList.cs 2009-12-26 05:36:53 UTC (rev 294) +++ trunk/Source/StructureMap/InstanceBuilderList.cs 2009-12-26 05:37:13 UTC (rev 295) @@ -1,117 +0,0 @@ -using System; -using System.Collections.Generic; -using StructureMap.Emitting; -using StructureMap.Graph; -using StructureMap.TypeRules; - -namespace StructureMap -{ - public class InstanceBuilderList - { - private readonly Dictionary<string, Type> _aliases = new Dictionary<string, Type>(); - private readonly Dictionary<Type, InstanceBuilder> _builders = new Dictionary<Type, InstanceBuilder>(); - private readonly Type _pluginType; - - - public InstanceBuilderList(Type pluginType, IEnumerable<Plugin> plugins) - { - _pluginType = pluginType; - processPlugins(plugins); - } - - public InstanceBuilderList(Type pluginType) - { - _pluginType = pluginType; - } - - public int BuilderCount - { - get { return _builders.Count; } - } - - - public InstanceBuilder FindByType(Type pluggedType) - { - if (pluggedType == null) - { - return null; - } - - if (_builders.ContainsKey(pluggedType)) - { - return _builders[pluggedType]; - } - - // Add a missing PluggedType if we can - if (pluggedType.CanBeCastTo(_pluginType) && Constructor.HasConstructors(pluggedType)) - { - var plugin = new Plugin(pluggedType); - processPlugin(plugin); - - return _builders[pluggedType]; - } - - return null; - } - - public InstanceBuilder FindByConcreteKey(string concreteKey) - { - if (_aliases.ContainsKey(concreteKey)) - { - Type pluggedType = _aliases[concreteKey]; - return FindByType(pluggedType); - } - - return null; - } - - private void processPlugin(Plugin plugin) - { - processPlugins(new[] {plugin}); - } - - private void processPlugins(IEnumerable<Plugin> plugins) - { - foreach (Plugin plugin in plugins) - { - if (_aliases.ContainsKey(plugin.ConcreteKey)) - { - continue; - } - - _aliases.Add(plugin.ConcreteKey, plugin.PluggedType); - } - - List<InstanceBuilder> list = createInstanceBuilders(plugins); - foreach (InstanceBuilder builder in list) - { - _builders.Add(builder.PluggedType, builder); - } - } - - private List<InstanceBuilder> createInstanceBuilders(IEnumerable<Plugin> plugins) - { - var list = new List<Plugin>(); - foreach (Plugin plugin in plugins) - { - if (!_builders.ContainsKey(plugin.PluggedType)) - { - list.Add(plugin); - } - } - - var builderAssembly = new InstanceBuilderAssembly(list); - return builderAssembly.Compile(); - } - - public void Add(Plugin plugin) - { - Add(new[] {plugin}); - } - - public void Add(IEnumerable<Plugin> plugins) - { - processPlugins(plugins); - } - } -} \ No newline at end of file Deleted: trunk/Source/StructureMap/InstanceFamily.cs =================================================================== --- trunk/Source/StructureMap/InstanceFamily.cs 2009-12-26 05:36:53 UTC (rev 294) +++ trunk/Source/StructureMap/InstanceFamily.cs 2009-12-26 05:37:13 UTC (rev 295) @@ -1,6 +0,0 @@ -namespace StructureMap -{ - public class InstanceFamily - { - } -} \ No newline at end of file Modified: trunk/Source/StructureMap/InstanceMemento.cs =================================================================== --- trunk/Source/StructureMap/InstanceMemento.cs 2009-12-26 05:36:53 UTC (rev 294) +++ trunk/Source/StructureMap/InstanceMemento.cs 2009-12-26 05:37:13 UTC (rev 295) @@ -193,7 +193,6 @@ return getPropertyValue(XmlConstants.PLUGGED_TYPE); } - // TODO -- this is where we can read other types public Instance ReadInstance(PluginGraph pluginGraph, Type pluginType) { try Modified: trunk/Source/StructureMap/PipelineGraph.cs =================================================================== --- trunk/Source/StructureMap/PipelineGraph.cs 2009-12-26 05:36:53 UTC (rev 294) +++ trunk/Source/StructureMap/PipelineGraph.cs 2009-12-26 05:37:13 UTC (rev 295) @@ -132,6 +132,7 @@ return _factories[pluginType]; } + [Obsolete("Replace this with a Cache")] private void createFactoryIfMissing(Type pluginType) { if (!_factories.ContainsKey(pluginType)) Modified: trunk/Source/StructureMap/StructureMap.csproj =================================================================== --- trunk/Source/StructureMap/StructureMap.csproj 2009-12-26 05:36:53 UTC (rev 294) +++ trunk/Source/StructureMap/StructureMap.csproj 2009-12-26 05:37:13 UTC (rev 295) @@ -144,16 +144,13 @@ <Compile Include="Diagnostics\TextLine.cs" /> <Compile Include="Diagnostics\TextReportWriter.cs" /> <Compile Include="Diagnostics\WhatDoIHaveWriter.cs" /> - <Compile Include="Emitting\ArgumentEmitter.cs" /> <Compile Include="Exceptions\StructureMapConfigurationException.cs" /> <Compile Include="ExplicitArgsExpression.cs" /> <Compile Include="Graph\Constructor.cs" /> <Compile Include="Graph\IArgumentVisitor.cs" /> <Compile Include="Graph\IPluginFamily.cs" /> <Compile Include="Graph\AssemblyScanner.cs" /> - <Compile Include="InstanceBuilderList.cs" /> <Compile Include="InstanceCache.cs" /> - <Compile Include="InstanceFamily.cs" /> <Compile Include="Interceptors\MatchedTypeInterceptor.cs" /> <Compile Include="PipelineGraph.cs" /> <Compile Include="Pipeline\ConfiguredInstance.cs" /> @@ -217,39 +214,6 @@ <Compile Include="Configuration\XmlConstants.cs"> <SubType>Code</SubType> </Compile> - <Compile Include="Emitting\BuildInstanceMethod.cs"> - <SubType>Code</SubType> - </Compile> - <Compile Include="Emitting\ClassBuilder.cs"> - <SubType>Code</SubType> - </Compile> - <Compile Include="Emitting\DynamicAssembly.cs"> - <SubType>Code</SubType> - </Compile> - <Compile Include="Emitting\InstanceBuilderAssembly.cs"> - <SubType>Code</SubType> - </Compile> - <Compile Include="Emitting\Method.cs"> - <SubType>Code</SubType> - </Compile> - <Compile Include="Emitting\Parameters\ChildArrayParameterEmitter.cs"> - <SubType>Code</SubType> - </Compile> - <Compile Include="Emitting\Parameters\ChildParameterEmitter.cs"> - <SubType>Code</SubType> - </Compile> - <Compile Include="Emitting\Parameters\EnumParameterEmitter.cs"> - <SubType>Code</SubType> - </Compile> - <Compile Include="Emitting\Parameters\ParameterEmitter.cs"> - <SubType>Code</SubType> - </Compile> - <Compile Include="Emitting\Parameters\PrimitiveParameterEmitter.cs"> - <SubType>Code</SubType> - </Compile> - <Compile Include="Emitting\Parameters\StringParameterEmitter.cs"> - <SubType>Code</SubType> - </Compile> <Compile Include="Exceptions\InstancePropertyValueException.cs"> <SubType>Code</SubType> </Compile> @@ -285,9 +249,6 @@ <SubType>Code</SubType> </Compile> <Compile Include="IContainer.cs" /> - <Compile Include="InstanceBuilder.cs"> - <SubType>Code</SubType> - </Compile> <Compile Include="InstanceFactory.cs"> <SubType>Code</SubType> </Compile> @@ -382,13 +343,16 @@ <Compile Include="Configuration\PrimitiveArrayReader.cs" /> <Compile Include="Configuration\TypeReaderFactory.cs" /> <Compile Include="Configuration\XmlExtensions.cs" /> + <Compile Include="Construction\BuilderCompiler.cs" /> + <Compile Include="Construction\ConstructorFunctionBuilder.cs" /> + <Compile Include="Construction\IArguments.cs" /> + <Compile Include="Construction\InstanceBuilder.cs" /> + <Compile Include="Construction\SetterBuilder.cs" /> <Compile Include="Diagnostics\Doctor.cs" /> <Compile Include="Diagnostics\DoctorReport.cs" /> <Compile Include="Diagnostics\DoctorResult.cs" /> <Compile Include="Diagnostics\DoctorRunner.cs" /> <Compile Include="Diagnostics\ValidationError.cs" /> - <Compile Include="Emitting\BuildUpMethod.cs" /> - <Compile Include="Emitting\Parameters\Methods.cs" /> <Compile Include="ErrorMessages.cs" /> <Compile Include="Example.cs" /> <Compile Include="Extensions.cs" /> @@ -401,6 +365,7 @@ <Compile Include="Graph\PluginCache.cs" /> <Compile Include="Graph\SingleImplementationScanner.cs" /> <Compile Include="IContext.cs" /> + <Compile Include="Pipeline\Arguments.cs" /> <Compile Include="Pipeline\ArrayCoercion.cs" /> <Compile Include="Pipeline\ConditionalInstance.cs" /> <Compile Include="Pipeline\ConstructorInstance.cs" /> Modified: trunk/Source/StructureMap/TypeExtensions.cs =================================================================== --- trunk/Source/StructureMap/TypeExtensions.cs 2009-12-26 05:36:53 UTC (rev 294) +++ trunk/Source/StructureMap/TypeExtensions.cs 2009-12-26 05:37:13 UTC (rev 295) @@ -1,13 +1,41 @@ using System; +using System.Collections.Generic; using StructureMap.Graph; using StructureMap.Pipeline; namespace StructureMap { + public static class BasicExtensions + { + public static void TryGet<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, + Action<TValue> action) + { + TValue value; + if (dictionary.TryGetValue(key, out value)) + { + action(value); + } + } + + public static T As<T>(this object target) where T : class + { + return target as T; + } + + public static bool IsIn<T>(this T target, IList<T> list) + { + return list.Contains(target); + } + } + namespace TypeRules { public static class TypeExtensions { + + + + public static bool Closes(this Type type, Type openType) { var baseType = type.BaseType; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-12-26 05:37:01
|
Revision: 294 http://structuremap.svn.sourceforge.net/structuremap/?rev=294&view=rev Author: jeremydmiller Date: 2009-12-26 05:36:53 +0000 (Sat, 26 Dec 2009) Log Message: ----------- The big, big, big switch from IL generation to dynamic Func's. Ding dong, the witch is dead. Modified Paths: -------------- trunk/Source/StructureMap/Util/Cache.cs Modified: trunk/Source/StructureMap/Util/Cache.cs =================================================================== --- trunk/Source/StructureMap/Util/Cache.cs 2009-12-26 05:36:06 UTC (rev 293) +++ trunk/Source/StructureMap/Util/Cache.cs 2009-12-26 05:36:53 UTC (rev 294) @@ -1,90 +1,100 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Threading; +using StructureMap.Graph; namespace StructureMap.Util { - public class Cache<KEY, VALUE> : IEnumerable<VALUE> where VALUE : class + [Serializable] + public class Cache<TKey, TValue> where TValue : class { - private readonly object _locker = new object(); - private readonly IDictionary<KEY, VALUE> _values; + readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion); + readonly IDictionary<TKey, TValue> _values; + Func<TValue, TKey> _getKey = delegate { throw new NotImplementedException(); }; - private Func<KEY, VALUE> _onMissing = delegate(KEY key) + Action<TValue> _onAddition = x => { }; + + Func<TKey, TValue> _onMissing = delegate(TKey key) { string message = string.Format("Key '{0}' could not be found", key); throw new KeyNotFoundException(message); }; public Cache() - : this(new Dictionary<KEY, VALUE>()) + : this(new Dictionary<TKey, TValue>()) { } - public Cache(Func<KEY, VALUE> onMissing) - : this(new Dictionary<KEY, VALUE>(), onMissing) + public Cache(Func<TKey, TValue> onMissing) + : this(new Dictionary<TKey, TValue>(), onMissing) { } - public Cache(IDictionary<KEY, VALUE> dictionary, Func<KEY, VALUE> onMissing) + public Cache(IDictionary<TKey, TValue> dictionary, Func<TKey, TValue> onMissing) : this(dictionary) { _onMissing = onMissing; } - public Cache(IDictionary<KEY, VALUE> dictionary) + public Cache(IDictionary<TKey, TValue> dictionary) { _values = dictionary; } - public Func<KEY, VALUE> OnMissing - { - set { _onMissing = value; } - } + public Func<TKey, TValue> OnMissing { set { _onMissing = value; } } + public Action<TValue> OnAddition { set { _onAddition = value; } } + + public Func<TValue, TKey> GetKey { get { return _getKey; } set { _getKey = value; } } + public int Count { - get { return _values.Count; } + get + { + using (ReadLock()) + return _values.Count; + } } - public VALUE First + public TValue First { get { - foreach (var pair in _values) - { - return pair.Value; - } + using (ReadLock()) + foreach (var pair in _values) + { + return pair.Value; + } return null; } } - - public VALUE this[KEY key] + public TValue this[TKey key] { get { - if (!_values.ContainsKey(key)) + using (var @lock = ReadLock()) { - lock (_locker) + if (!_values.ContainsKey(key)) { + @lock.Upgrade(); if (!_values.ContainsKey(key)) { - VALUE value = _onMissing(key); - //Check to make sure that the onMissing didn't cache this already - if(!_values.ContainsKey(key)) - { - _values.Add(key, value); - } + TValue value = _onMissing(key); + _values.Add(key, value); } } + + return _values[key]; } - - return _values[key]; } set { - lock (_locker) + _onAddition(value); + + using (var @lock = WriteLock()) { if (_values.ContainsKey(key)) { @@ -98,33 +108,22 @@ } } - #region IEnumerable<VALUE> Members - - IEnumerator IEnumerable.GetEnumerator() + public void Fill(TKey key, TValue value) { - return ((IEnumerable<VALUE>)this).GetEnumerator(); - } + using (WriteLock()) + { + if (_values.ContainsKey(key)) + { + return; + } - public IEnumerator<VALUE> GetEnumerator() - { - return _values.Values.GetEnumerator(); - } - - #endregion - - public void Fill(KEY key, VALUE value) - { - if (_values.ContainsKey(key)) - { - return; + _values.Add(key, value); } - - _values.Add(key, value); } - public void Each(Action<VALUE> action) + public void Each(Action<TValue> action) { - lock (_locker) + using (ReadLock()) { foreach (var pair in _values) { @@ -133,73 +132,150 @@ } } - public void Each(Action<KEY, VALUE> action) + public void Each(Action<TKey, TValue> action) { - foreach (var pair in _values) + using (ReadLock()) { - action(pair.Key, pair.Value); + foreach (var pair in _values) + { + action(pair.Key, pair.Value); + } } } - public bool Has(KEY key) + public bool Has(TKey key) { - return _values.ContainsKey(key); + using (ReadLock()) + return _values.ContainsKey(key); } - public bool Exists(Predicate<VALUE> predicate) + public bool Exists(Predicate<TValue> predicate) { bool returnValue = false; - Each(delegate(VALUE value) { returnValue |= predicate(value); }); + Each(delegate(TValue value) { returnValue |= predicate(value); }); return returnValue; } - public VALUE Find(Predicate<VALUE> predicate) + public TValue Find(Predicate<TValue> predicate) { - foreach (var pair in _values) - { - if (predicate(pair.Value)) + using (ReadLock()) + foreach (var pair in _values) { - return pair.Value; + if (predicate(pair.Value)) + { + return pair.Value; + } } - } return null; } - public VALUE[] GetAll() + public TKey Find(TValue value) { - var returnValue = new VALUE[Count]; - _values.Values.CopyTo(returnValue, 0); + using (ReadLock()) + foreach (KeyValuePair<TKey, TValue> pair in _values) + { + if (pair.Value == value) + { + return pair.Key; + } + } + return default(TKey); + } + + public TValue[] GetAll() + { + var returnValue = new TValue[Count]; + using (ReadLock()) + _values.Values.CopyTo(returnValue, 0); + return returnValue; } - public IDictionary<KEY, VALUE> Contents() + public void Remove(TKey key) { - return _values; + using (ReadLock()) + if (_values.ContainsKey(key)) + { + _values.Remove(key); + } } - public void Remove(KEY key) + public void Clear() { - if (_values.ContainsKey(key)) + using (WriteLock()) + _values.Clear(); + } + + public void WithValue(TKey key, Action<TValue> callback) + { + using (ReadLock()) + _values.TryGet(key, callback); + } + + ReadLockToken ReadLock() + { + return new ReadLockToken(_lock); + } + + WriteLockToken WriteLock() + { + return new WriteLockToken(_lock); + } + + class ReadLockToken : IDisposable + { + readonly ReaderWriterLockSlim _lock; + bool upgraded; + + public ReadLockToken(ReaderWriterLockSlim @lock) { - _values.Remove(key); + _lock = @lock; + _lock.EnterReadLock(); } + + public void Upgrade() + { + _lock.ExitReadLock(); + _lock.EnterWriteLock(); + upgraded = true; + } + + public void Dispose() + { + if (upgraded) + _lock.ExitWriteLock(); + else + _lock.ExitReadLock(); + } } - public void Clear() + class WriteLockToken : IDisposable { - _values.Clear(); + readonly ReaderWriterLockSlim _lock; + public WriteLockToken(ReaderWriterLockSlim @lock) + { + _lock = @lock; + _lock.EnterWriteLock(); + } + + public void Dispose() + { + _lock.EnterWriteLock(); + } } - public Cache<KEY, VALUE> Clone() + public Cache<TKey, TValue> Clone() { - var clone = new Cache<KEY, VALUE>(_onMissing); - Each((k, v) => clone[k] = v); + var cache = new Cache<TKey, TValue>(); + cache._onMissing = _onMissing; + + Each((key, value) => cache[key] = value); - return clone; + return cache; } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-12-26 05:36:13
|
Revision: 293 http://structuremap.svn.sourceforge.net/structuremap/?rev=293&view=rev Author: jeremydmiller Date: 2009-12-26 05:36:06 +0000 (Sat, 26 Dec 2009) Log Message: ----------- The big, big, big switch from IL generation to dynamic Func's. Ding dong, the witch is dead. Modified Paths: -------------- trunk/Source/StructureMap/Pipeline/ArrayCoercion.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs trunk/Source/StructureMap/Pipeline/DefaultInstance.cs trunk/Source/StructureMap/Pipeline/EnumerableInstance.cs trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs trunk/Source/StructureMap/Pipeline/IConfiguredInstance.cs trunk/Source/StructureMap/Pipeline/IEnumerableCoercion.cs trunk/Source/StructureMap/Pipeline/Instance.cs trunk/Source/StructureMap/Pipeline/InstanceMementoPropertyReader.cs trunk/Source/StructureMap/Pipeline/ListCoercion.cs trunk/Source/StructureMap/Pipeline/ObjectInstance.cs trunk/Source/StructureMap/Pipeline/Profile.cs trunk/Source/StructureMap/Pipeline/PropertyExpression.cs trunk/Source/StructureMap/Pipeline/ReferencedInstance.cs trunk/Source/StructureMap/Pipeline/SmartInstance.cs Added Paths: ----------- trunk/Source/StructureMap/Pipeline/Arguments.cs Added: trunk/Source/StructureMap/Pipeline/Arguments.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/Arguments.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/Arguments.cs 2009-12-26 05:36:06 UTC (rev 293) @@ -0,0 +1,26 @@ +using StructureMap.Construction; + +namespace StructureMap.Pipeline +{ + public class Arguments : IArguments + { + private readonly IConfiguredInstance _instance; + private readonly BuildSession _session; + + public Arguments(IConfiguredInstance instance, BuildSession session) + { + _instance = instance; + _session = session; + } + + public T Get<T>(string propertyName) + { + return _instance.Get<T>(propertyName, _session); + } + + public bool Has(string propertyName) + { + return _instance.HasProperty(propertyName, _session); + } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/ArrayCoercion.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ArrayCoercion.cs 2009-12-26 05:34:50 UTC (rev 292) +++ trunk/Source/StructureMap/Pipeline/ArrayCoercion.cs 2009-12-26 05:36:06 UTC (rev 293) @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; @@ -9,5 +10,7 @@ { return enumerable.Select(x => x as T).ToArray(); } + + public Type ElementType { get { return typeof (T); } } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs 2009-12-26 05:34:50 UTC (rev 292) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs 2009-12-26 05:36:06 UTC (rev 293) @@ -78,8 +78,6 @@ /// <returns></returns> public ChildArrayExpression ChildArray<PLUGINTYPE>(string propertyName) { - validateTypeIsArray<PLUGINTYPE>(); - var expression = new ChildArrayExpression(this, propertyName); @@ -98,8 +96,6 @@ public ChildArrayExpression ChildArray(Type pluginType) { - //TODO: add validation check - validateTypeIsArray(pluginType); var propertyName = findPropertyName(pluginType); return ChildArray(propertyName); } @@ -231,7 +227,7 @@ /// <returns></returns> public ConfiguredInstance Contains(params Instance[] instances) { - _instance.setChildArray(_propertyName, instances); + _instance.SetCollection(_propertyName, instances); return _instance; } @@ -278,7 +274,7 @@ public ConfiguredInstance IsNamedInstance(string instanceKey) { var instance = new ReferencedInstance(instanceKey); - _instance.setChild(_propertyName, instance); + _instance.SetChild(_propertyName, instance); return _instance; } @@ -303,7 +299,7 @@ ExpressionValidator.ValidatePluggabilityOf(pluggedType).IntoPluginType(_childType); var childInstance = new ConfiguredInstance(pluggedType); - _instance.setChild(_propertyName, childInstance); + _instance.SetChild(_propertyName, childInstance); return _instance; } @@ -316,7 +312,7 @@ /// <returns></returns> public ConfiguredInstance Is(Instance child) { - _instance.setChild(_propertyName, child); + _instance.SetChild(_propertyName, child); return _instance; } Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs 2009-12-26 05:34:50 UTC (rev 292) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstance.cs 2009-12-26 05:36:06 UTC (rev 293) @@ -9,69 +9,31 @@ /// and filling setter properties. ConfiguredInstance should only be used for open generic types. /// Favor <see cref="SmartInstance{T}">SmartInstance{T}</see> for all other usages. /// </summary> - public partial class ConfiguredInstance : ConfiguredInstanceBase<ConfiguredInstance> + public partial class ConfiguredInstance : ConstructorInstance { - public ConfiguredInstance(InstanceMemento memento, PluginGraph graph, Type pluginType) - : base(memento, graph, pluginType) + public ConfiguredInstance(InstanceMemento memento, PluginGraph graph, Type pluginType) : base(memento.FindPlugin(graph.FindFamily(pluginType))) { + read(memento, graph, pluginType); } - public ConfiguredInstance(Type pluggedType, string name) : base(pluggedType, name) + private void read(InstanceMemento memento, PluginGraph graph, Type pluginType) { + var reader = new InstanceMementoPropertyReader(this, memento, graph, pluginType); + plugin.VisitArguments(reader); } - - public ConfiguredInstance(Type pluggedType) : base(pluggedType) + public ConfiguredInstance(Type pluggedType, string name) : base(pluggedType, name) { } - public ConfiguredInstance(Type templateType, params Type[] types) : base(GetGenericType(templateType, types)) - { - } - public static Type GetGenericType(Type templateType, params Type[] types) + public ConfiguredInstance(Type pluggedType) : base(pluggedType) { - return templateType.MakeGenericType(types); - } - protected void setPluggedType(Type pluggedType) - { - _pluggedType = pluggedType; } - - protected override void preprocess(PluginFamily family) + public ConfiguredInstance(Type templateType, params Type[] types) : base(templateType.MakeGenericType(types)) { } - - protected override string getDescription() - { - string typeName = _pluggedType.AssemblyQualifiedName; - var ctor = new Constructor(_pluggedType); - if (ctor.HasArguments()) - { - return "Configured " + typeName; - } - else - { - return typeName; - } - } - - protected override void addTemplatedInstanceTo(PluginFamily family, Type[] templateTypes) - { - Type specificType = _pluggedType.IsGenericTypeDefinition - ? _pluggedType.MakeGenericType(templateTypes) - : _pluggedType; - if (specificType.CanBeCastTo(family.PluginType)) - { - var instance = new ConfiguredInstance(specificType); - instance._arrays = _arrays; - instance._children = _children; - instance._properties = _properties; - instance.Name = Name; - family.AddInstance(instance); - } - } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs 2009-12-26 05:34:50 UTC (rev 292) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs 2009-12-26 05:36:06 UTC (rev 293) @@ -8,291 +8,293 @@ public interface BasicInstance { Type PluggedType { get; } + + Dictionary<string, string> Properties { get; } Dictionary<string, Instance> Children { get; } Dictionary<string, Instance[]> Arrays { get; } } - public abstract class ConfiguredInstanceBase<T> : Instance, IConfiguredInstance, IStructuredInstance, BasicInstance - { - protected Dictionary<string, Instance[]> _arrays = new Dictionary<string, Instance[]>(); - protected Dictionary<string, Instance> _children = new Dictionary<string, Instance>(); - protected Type _pluggedType; - protected Dictionary<string, string> _properties = new Dictionary<string, string>(); + //public abstract class ConfiguredInstanceBase<T> : Instance, IConfiguredInstance, IStructuredInstance, BasicInstance + //{ + // protected Dictionary<string, Instance[]> _arrays = new Dictionary<string, Instance[]>(); + // protected Dictionary<string, Instance> _children = new Dictionary<string, Instance>(); + // protected Type _pluggedType; + // protected Dictionary<string, string> _properties = new Dictionary<string, string>(); - protected ConfiguredInstanceBase(InstanceMemento memento, PluginGraph graph, Type pluginType) - { - read(memento, graph, pluginType); - } + // protected ConfiguredInstanceBase(InstanceMemento memento, PluginGraph graph, Type pluginType) + // { + // read(memento, graph, pluginType); + // } - protected ConfiguredInstanceBase(Type pluggedType, string name) - { - _pluggedType = pluggedType; - Name = name; - } + // protected ConfiguredInstanceBase(Type pluggedType, string name) + // { + // _pluggedType = pluggedType; + // Name = name; + // } - protected ConfiguredInstanceBase(Type pluggedType) : this(pluggedType, Guid.NewGuid().ToString()) - { - if (pluggedType != null) - if (pluggedType.IsAbstract || pluggedType.IsInterface) - { - throw new StructureMapException(25); - } - } + // protected ConfiguredInstanceBase(Type pluggedType) : this(pluggedType, Guid.NewGuid().ToString()) + // { + // if (pluggedType != null) + // if (pluggedType.IsAbstract || pluggedType.IsInterface) + // { + // throw new StructureMapException(25); + // } + // } - #region Copyable Members + // #region Copyable Members - Type BasicInstance.PluggedType - { - get { return _pluggedType; } - } + // Type BasicInstance.PluggedType + // { + // get { return _pluggedType; } + // } - Dictionary<string, string> BasicInstance.Properties - { - get { return _properties; } - } + // Dictionary<string, string> BasicInstance.Properties + // { + // get { return _properties; } + // } - Dictionary<string, Instance> BasicInstance.Children - { - get { return _children; } - } + // Dictionary<string, Instance> BasicInstance.Children + // { + // get { return _children; } + // } - Dictionary<string, Instance[]> BasicInstance.Arrays - { - get { return _arrays; } - } + // Dictionary<string, Instance[]> BasicInstance.Arrays + // { + // get { return _arrays; } + // } - #endregion + // #endregion - #region IConfiguredInstance Members + // //#region IConfiguredInstance Members - Type IConfiguredInstance.PluggedType - { - get { return _pluggedType; } - } + // //Type IConfiguredInstance.PluggedType + // //{ + // // get { return _pluggedType; } + // //} - Instance[] IConfiguredInstance.GetChildrenArray(string propertyName) - { - return _arrays.ContainsKey(propertyName) ? _arrays[propertyName] : null; - } + // //Instance[] IConfiguredInstance.GetChildrenArray(string propertyName) + // //{ + // // return _arrays.ContainsKey(propertyName) ? _arrays[propertyName] : null; + // //} - string IConfiguredInstance.GetProperty(string propertyName) - { - if (!_properties.ContainsKey(propertyName)) - { - throw new StructureMapException(205, propertyName, Name); - } + // //string IConfiguredInstance.GetProperty(string propertyName) + // //{ + // // if (!_properties.ContainsKey(propertyName)) + // // { + // // throw new StructureMapException(205, propertyName, Name); + // // } - return _properties[propertyName]; - } + // // return _properties[propertyName]; + // //} - object IConfiguredInstance.Get(string propertyName, Type pluginType, BuildSession buildSession) - { - return getChild(propertyName, pluginType, buildSession); - } + // //object IConfiguredInstance.Get(string propertyName, Type pluginType, BuildSession buildSession) + // //{ + // // return getChild(propertyName, pluginType, buildSession); + // //} - object IConfiguredInstance.Build(Type pluginType, BuildSession session, InstanceBuilder builder) - { - if (builder == null) - { - throw new StructureMapException( - 201, _pluggedType.FullName, Name, pluginType); - } + // //object IConfiguredInstance.Build(Type pluginType, BuildSession session, InstanceBuilder builder) + // //{ + // // if (builder == null) + // // { + // // throw new StructureMapException( + // // 201, _pluggedType.FullName, Name, pluginType); + // // } - try - { - return builder.BuildInstance(this, session); - } - catch (StructureMapException) - { - throw; - } - catch (InvalidCastException ex) - { - throw new StructureMapException(206, ex, Name); - } - catch (Exception ex) - { - throw new StructureMapException(207, ex, Name, pluginType.FullName); - } - } + // // try + // // { + // // return builder.BuildInstance(this, session); + // // } + // // catch (StructureMapException) + // // { + // // throw; + // // } + // // catch (InvalidCastException ex) + // // { + // // throw new StructureMapException(206, ex, Name); + // // } + // // catch (Exception ex) + // // { + // // throw new StructureMapException(207, ex, Name, pluginType.FullName); + // // } + // //} - bool IConfiguredInstance.HasProperty(string propertyName) - { - return _properties.ContainsKey(propertyName) || _children.ContainsKey(propertyName) || - _arrays.ContainsKey(propertyName); - } + // //bool IConfiguredInstance.HasProperty(string propertyName, BuildSession session) + // //{ + // // return _properties.ContainsKey(propertyName) || _children.ContainsKey(propertyName) || + // // _arrays.ContainsKey(propertyName); + // //} - void IConfiguredInstance.SetProperty(string propertyName, string propertyValue) - { - setProperty(propertyName, propertyValue); - } + // //void IConfiguredInstance.SetProperty(string propertyName, string propertyValue) + // //{ + // // setProperty(propertyName, propertyValue); + // //} - void IConfiguredInstance.Set(string name, Instance instance) - { - setChild(name, instance); - } + // //void IConfiguredInstance.SetChild(string name, Instance instance) + // //{ + // // setChild(name, instance); + // //} - void IConfiguredInstance.SetChildArray(string name, Type type, Instance[] children) - { - setChildArray(name, children); - } + // //void IConfiguredInstance.SetChildArray(string name, Type type, Instance[] children) + // //{ + // // setChildArray(name, children); + // //} - #endregion + // //#endregion - #region IStructuredInstance Members + // #region IStructuredInstance Members - Instance IStructuredInstance.GetChild(string name) - { - return _children[name]; - } + // Instance IStructuredInstance.GetChild(string name) + // { + // return _children[name]; + // } - Instance[] IStructuredInstance.GetChildArray(string name) - { - return _arrays[name]; - } + // Instance[] IStructuredInstance.GetChildArray(string name) + // { + // return _arrays[name]; + // } - void IStructuredInstance.RemoveKey(string name) - { - _properties.Remove(name); - } + // void IStructuredInstance.RemoveKey(string name) + // { + // _properties.Remove(name); + // } - #endregion + // #endregion - protected override object build(Type pluginType, BuildSession session) - { - InstanceBuilder builder = PluginCache.FindBuilder(_pluggedType); - return ((IConfiguredInstance) this).Build(pluginType, session, builder); - } + // protected override object build(Type pluginType, BuildSession session) + // { + // InstanceBuilder builder = PluginCache.FindBuilder(_pluggedType); + // return ((IConfiguredInstance) this).Build(pluginType, session, builder); + // } - protected virtual object getChild(string propertyName, Type pluginType, BuildSession buildSession) - { - Instance childInstance = _children.ContainsKey(propertyName) - ? _children[propertyName] - : new DefaultInstance(); + // protected virtual object getChild(string propertyName, Type pluginType, BuildSession buildSession) + // { + // Instance childInstance = _children.ContainsKey(propertyName) + // ? _children[propertyName] + // : new DefaultInstance(); - return childInstance.Build(pluginType, buildSession); - } + // return childInstance.Build(pluginType, buildSession); + // } - protected override bool canBePartOfPluginFamily(PluginFamily family) - { - return _pluggedType.CanBeCastTo(family.PluginType) && Constructor.HasConstructors(_pluggedType); - } + // protected override bool canBePartOfPluginFamily(PluginFamily family) + // { + // return _pluggedType.CanBeCastTo(family.PluginType) && Constructor.HasConstructors(_pluggedType); + // } - internal override bool Matches(Plugin plugin) - { - return plugin.PluggedType == _pluggedType; - } + // internal override bool Matches(Plugin plugin) + // { + // return plugin.PluggedType == _pluggedType; + // } - private void read(InstanceMemento memento, PluginGraph graph, Type pluginType) - { - PluginFamily family = graph.FindFamily(pluginType); - Plugin plugin = memento.FindPlugin(family); + // private void read(InstanceMemento memento, PluginGraph graph, Type pluginType) + // { + // PluginFamily family = graph.FindFamily(pluginType); + // Plugin plugin = memento.FindPlugin(family); - _pluggedType = plugin.PluggedType; + // _pluggedType = plugin.PluggedType; - var reader = new InstanceMementoPropertyReader(this, memento, graph, pluginType); - plugin.VisitArguments(reader); - } + // var reader = new InstanceMementoPropertyReader(this, memento, graph, pluginType); + // plugin.VisitArguments(reader); + // } - protected void setChild(string name, Instance instance) - { - if (instance == null) return; + // protected void setChild(string name, Instance instance) + // { + // if (instance == null) return; - if (_children.ContainsKey(name)) - { - _children[name] = instance; - } - else - { - _children.Add(name, instance); - } + // if (_children.ContainsKey(name)) + // { + // _children[name] = instance; + // } + // else + // { + // _children.Add(name, instance); + // } - } + // } - protected void setChildArray(string name, Instance[] array) - { - for (int i = 0; i < array.Length; i++) - { - if (array[i] == null) - { - throw new ApplicationException("There is a null value in the array of child Instances"); - } + // protected void setChildArray(string name, Instance[] array) + // { + // for (int i = 0; i < array.Length; i++) + // { + // if (array[i] == null) + // { + // throw new ApplicationException("There is a null value in the array of child Instances"); + // } - } + // } - _arrays.Add(name, array); - } + // _arrays.Add(name, array); + // } - protected override Type getConcreteType(Type pluginType) - { - return _pluggedType; - } + // protected override Type getConcreteType(Type pluginType) + // { + // return _pluggedType; + // } - protected string findPropertyName<PLUGINTYPE>() - { - Type dependencyType = typeof(PLUGINTYPE); + // protected string findPropertyName<PLUGINTYPE>() + // { + // Type dependencyType = typeof(PLUGINTYPE); - return findPropertyName(dependencyType); - } + // return findPropertyName(dependencyType); + // } - protected string findPropertyName(Type dependencyType) - { - var plugin = new Plugin(_pluggedType); - string propertyName = plugin.FindArgumentNameForType(dependencyType); + // protected string findPropertyName(Type dependencyType) + // { + // var plugin = new Plugin(_pluggedType); + // string propertyName = plugin.FindArgumentNameForType(dependencyType); - if (string.IsNullOrEmpty(propertyName)) - { - throw new StructureMapException(305, dependencyType); - } + // if (string.IsNullOrEmpty(propertyName)) + // { + // throw new StructureMapException(305, dependencyType); + // } - return propertyName; - } + // return propertyName; + // } - protected static void validateTypeIsArray<PLUGINTYPE>() - { - validateTypeIsArray(typeof(PLUGINTYPE)); - } + // protected static void validateTypeIsArray<PLUGINTYPE>() + // { + // validateTypeIsArray(typeof(PLUGINTYPE)); + // } - protected static void validateTypeIsArray(Type pluginType) - { - if (!pluginType.IsArray) - { - throw new StructureMapException(307); - } - } + // protected static void validateTypeIsArray(Type pluginType) + // { + // if (!pluginType.IsArray) + // { + // throw new StructureMapException(307); + // } + // } - protected void setProperty(string propertyName, string propertyValue) - { - if (string.IsNullOrEmpty(propertyValue)) return; - _properties[propertyName] = propertyValue; - } + // protected void setProperty(string propertyName, string propertyValue) + // { + // if (string.IsNullOrEmpty(propertyValue)) return; + // _properties[propertyName] = propertyValue; + // } - protected void mergeIntoThis(BasicInstance instance) - { - _pluggedType = instance.PluggedType; + // protected void mergeIntoThis(BasicInstance instance) + // { + // _pluggedType = instance.PluggedType; - foreach (var pair in instance.Properties) - { - if (!_properties.ContainsKey(pair.Key)) - { - _properties.Add(pair.Key, pair.Value); - } - } + // foreach (var pair in instance.Properties) + // { + // if (!_properties.ContainsKey(pair.Key)) + // { + // _properties.Add(pair.Key, pair.Value); + // } + // } - foreach (var pair in instance.Children) - { - if (!_children.ContainsKey(pair.Key)) - { - _children.Add(pair.Key, pair.Value); - } - } + // foreach (var pair in instance.Children) + // { + // if (!_children.ContainsKey(pair.Key)) + // { + // _children.Add(pair.Key, pair.Value); + // } + // } - _arrays = instance.Arrays; - } - } + // _arrays = instance.Arrays; + // } + //} } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs 2009-12-26 05:34:50 UTC (rev 292) +++ trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs 2009-12-26 05:36:06 UTC (rev 293) @@ -1,56 +1,179 @@ using System; using System.Collections.Generic; using System.ComponentModel; +using StructureMap.Construction; using StructureMap.Graph; using StructureMap.TypeRules; using StructureMap.Util; +using System.Linq; namespace StructureMap.Pipeline { - public class ConstructorInstance : Instance + + + public class ConstructorInstance : Instance, IConfiguredInstance, IStructuredInstance { private readonly Cache<string, Instance> _dependencies = new Cache<string, Instance>(); private readonly Plugin _plugin; - public ConstructorInstance(Type pluggedType) + public ConstructorInstance(Type pluggedType) : this(PluginCache.GetPlugin(pluggedType)) { - _plugin = PluginCache.GetPlugin(pluggedType); + } - protected override string getDescription() + protected override bool canBePartOfPluginFamily(PluginFamily family) { + return _plugin.PluggedType.CanBeCastTo(family.PluginType); + } + + public ConstructorInstance(Plugin plugin) + { + _plugin = plugin; + + _dependencies.OnMissing = key => + { + if (_plugin.FindArgumentType(key).IsSimple()) + { + throw new StructureMapException(205, key, Name); + } + + return new DefaultInstance(); + }; + } + + public ConstructorInstance Override(ExplicitArguments arguments) + { + var instance = new ConstructorInstance(_plugin); + _dependencies.Each((key, i) => instance.SetChild(key, i)); + + arguments.Configure(instance); + + return instance; + } + + public ConstructorInstance(Type pluggedType, string name) : this(pluggedType) + { + Name = name; + } + + protected override void addTemplatedInstanceTo(PluginFamily family, Type[] templateTypes) + { + throw new NotImplementedException(); + } + + protected Plugin plugin { get { return _plugin; } } + + protected sealed override string getDescription() + { return "Configured Instance of " + _plugin.PluggedType.AssemblyQualifiedName; } - public void SetChild(string name, Instance instance) + protected sealed override Type getConcreteType(Type pluginType) { + return _plugin.PluggedType; + } + + void IConfiguredInstance.SetChild(string name, Instance instance) + { + SetChild(name, instance); + } + + public void SetValue(Type type, object value) + { + var name = _plugin.FindArgumentNameForType(type); + SetValue(name, value); + } + + void IConfiguredInstance.SetValue(string name, object value) + { + SetValue(name, value); + } + + void IConfiguredInstance.SetCollection(string name, IEnumerable<Instance> children) + { + SetCollection(name, children); + } + + public string GetProperty(string propertyName) + { + return _dependencies[propertyName].As<ObjectInstance>().Object.ToString(); + } + + internal void SetChild(string name, Instance instance) + { + if (instance == null) + { + throw new ArgumentNullException("instance", "Instance for {0} was null".ToFormat(name)); + } + _dependencies[name] = instance; } - public void SetValue(string name, object value) + internal void SetValue(string name, object value) { - var dependencyType = _plugin.FindArgumentType(name); + Type dependencyType = getDependencyType(name); + var instance = buildInstanceForType(dependencyType, value); - _dependencies[name] = instance; + SetChild(name, instance); } - public void SetCollection(string name, IEnumerable<Instance> children) + private Type getDependencyType(string name) { var dependencyType = _plugin.FindArgumentType(name); + if (dependencyType == null) + { + throw new ArgumentOutOfRangeException("name", + "Could not find a constructor parameter or property for {0} named {1}" + .ToFormat(_plugin.PluggedType.AssemblyQualifiedName, name)); + } + return dependencyType; + } + + internal void SetCollection(string name, IEnumerable<Instance> children) + { + Type dependencyType = getDependencyType(name); var instance = new EnumerableInstance(dependencyType, children); - _dependencies[name] = instance; + SetChild(name, instance); } - private static Instance buildInstanceForType(Type dependencyType, object value) + protected string findPropertyName<PLUGINTYPE>() { + Type dependencyType = typeof(PLUGINTYPE); + + return findPropertyName(dependencyType); + } + + protected string findPropertyName(Type dependencyType) + { + string propertyName = _plugin.FindArgumentNameForType(dependencyType); + + if (string.IsNullOrEmpty(propertyName)) + { + throw new StructureMapException(305, dependencyType); + } + + return propertyName; + } + + private Instance buildInstanceForType(Type dependencyType, object value) + { if (value == null) return new NullInstance(); if (dependencyType.IsSimple() || dependencyType.IsNullable() || dependencyType == typeof(Guid) || dependencyType == typeof(DateTime)) { - var converter = TypeDescriptor.GetConverter(dependencyType); - var convertedValue = converter.ConvertFrom(value); - return new ObjectInstance(convertedValue); + try + { + if (value.GetType() == dependencyType) return new ObjectInstance(value); + + var converter = TypeDescriptor.GetConverter(dependencyType); + var convertedValue = converter.ConvertFrom(value); + return new ObjectInstance(convertedValue); + } + catch (Exception e) + { + throw new StructureMapException(206, e, Name); + } } @@ -62,19 +185,103 @@ return _dependencies[propertyName].Build(pluginType, session); } + public T Get<T>(string propertyName, BuildSession session) + { + object o = Get(propertyName, typeof (T), session); + if (o == null) return default(T); + + return (T)o; + } + protected override object build(Type pluginType, BuildSession session) { - throw new NotImplementedException(); + IInstanceBuilder builder = PluginCache.FindBuilder(_plugin.PluggedType); + return Build(pluginType, session, builder); } - public object Build(Type pluginType, BuildSession session, InstanceBuilder builder) + public Type PluggedType { - throw new NotImplementedException(); + get { return _plugin.PluggedType; } } + public bool HasProperty(string propertyName, BuildSession session) + { + // TODO -- richer behavior + return _dependencies.Has(propertyName); + } + + public object Build(Type pluginType, BuildSession session, IInstanceBuilder builder) + { + if (builder == null) + { + throw new StructureMapException( + 201, _plugin.PluggedType.FullName, Name, pluginType); + } + + + try + { + var args = new Arguments(this, session); + return builder.BuildInstance(args); + } + catch (StructureMapException) + { + throw; + } + catch (InvalidCastException ex) + { + throw new StructureMapException(206, ex, Name); + } + catch (Exception ex) + { + throw new StructureMapException(207, ex, Name, pluginType.FullName); + } + } + public static ConstructorInstance For<T>() { return new ConstructorInstance(typeof(T)); } + + Instance IStructuredInstance.GetChild(string name) + { + return _dependencies[name]; + } + + Instance[] IStructuredInstance.GetChildArray(string name) + { + return _dependencies[name].As<EnumerableInstance>().Children.ToArray(); + } + + void IStructuredInstance.RemoveKey(string name) + { + _dependencies.Remove(name); + } + + public override Instance CloseType(Type[] types) + { + if (_plugin.PluggedType.IsOpenGeneric()) + { + var closedType = _plugin.PluggedType.MakeGenericType(types); + var closedInstance = new ConstructorInstance(closedType); + + _dependencies.Each((key, i) => + { + if (i.CopyAsIsWhenClosingInstance) + { + closedInstance.SetChild(key, i); + } + }); + + return closedInstance; + } + + return null; + } + + public override string ToString() + { + return "'{0}' -> {1}".ToFormat(Name, _plugin.PluggedType.FullName); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/DefaultInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/DefaultInstance.cs 2009-12-26 05:34:50 UTC (rev 292) +++ trunk/Source/StructureMap/Pipeline/DefaultInstance.cs 2009-12-26 05:36:06 UTC (rev 293) @@ -4,6 +4,11 @@ { public class DefaultInstance : Instance { + public DefaultInstance() + { + CopyAsIsWhenClosingInstance = true; + } + protected override bool doesRecordOnTheStack { get { return false; } @@ -11,6 +16,12 @@ protected override object build(Type pluginType, BuildSession session) { + if (EnumerableInstance.IsEnumerable(pluginType)) + { + var enumerable = new EnumerableInstance(pluginType, null); + return enumerable.Build(pluginType, session); + } + return session.CreateInstance(pluginType); } Modified: trunk/Source/StructureMap/Pipeline/EnumerableInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/EnumerableInstance.cs 2009-12-26 05:34:50 UTC (rev 292) +++ trunk/Source/StructureMap/Pipeline/EnumerableInstance.cs 2009-12-26 05:36:06 UTC (rev 293) @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Linq; @@ -44,6 +45,8 @@ throw new ArgumentException("Only IEnumerable<T> types can be passed to this constructor. {0} is invalid".ToFormat(propertyType.AssemblyQualifiedName)); } + public IEnumerable<Instance> Children { get { return _children; } } + protected override string getDescription() { return _description; @@ -51,8 +54,27 @@ protected override object build(Type pluginType, BuildSession session) { - var objects = _children.Select(x => x.Build(pluginType, session)); + var elementType = _coercion.ElementType; + + var objects = buildObjects(elementType, session); return _coercion.Convert(objects); } + + private IEnumerable<object> buildObjects(Type elementType, BuildSession session) + { + if (_children == null) + { + return session.GetAllInstances(elementType); + } + + return _children.Select(x => x.Build(elementType, session)); + } + + public static bool IsEnumerable(Type type) + { + if (type.IsArray) return true; + + return type.IsGenericType && type.GetGenericTypeDefinition().IsIn(_enumerableTypes); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs 2009-12-26 05:34:50 UTC (rev 292) +++ trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs 2009-12-26 05:36:06 UTC (rev 293) @@ -49,13 +49,15 @@ public void Configure(IConfiguredInstance instance) { - foreach (var arg in _args) + _args.Each(pair => { - if (arg.Value == null) continue; + instance.SetValue(pair.Key, pair.Value); + }); - instance.SetProperty(arg.Key, arg.Value.ToString()); - instance.Set(arg.Key, new ObjectInstance(arg.Value)); - } + _children.Each(pair => + { + instance.SetValue(pair.Key, pair.Value); + }); } public bool Has(Type type) @@ -77,31 +79,4 @@ } } - public class ExplicitInstance : ConfiguredInstance - { - private readonly ExplicitArguments _args; - - public ExplicitInstance(Type pluginType, ExplicitArguments args, BasicInstance defaultInstance) : base(null) - { - args.Configure(this); - _args = args; - mergeIntoThis(defaultInstance); - } - - - protected override object getChild(string propertyName, Type pluginType, BuildSession buildSession) - { - if (_args.Has(pluginType)) - { - return _args.Get(pluginType); - } - - if (_args.Has(propertyName)) - { - return _args.GetArg(propertyName); - } - - return base.getChild(propertyName, pluginType, buildSession); - } - } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/IConfiguredInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/IConfiguredInstance.cs 2009-12-26 05:34:50 UTC (rev 292) +++ trunk/Source/StructureMap/Pipeline/IConfiguredInstance.cs 2009-12-26 05:36:06 UTC (rev 293) @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; namespace StructureMap.Pipeline { @@ -7,28 +8,17 @@ string Name { get; } Type PluggedType { get; } - - - [Obsolete] - Instance[] GetChildrenArray(string propertyName); - - [Obsolete] - string GetProperty(string propertyName); - - object Get(string propertyName, Type pluginType, BuildSession buildSession); - object Build(Type pluginType, BuildSession session, InstanceBuilder builder); + T Get<T>(string propertyName, BuildSession session); - bool HasProperty(string propertyName); + bool HasProperty(string propertyName, BuildSession session); - [Obsolete] - void SetProperty(string name, string value); - - - void Set(string name, Instance instance); + void SetChild(string name, Instance instance); + void SetValue(Type type, object value); + void SetValue(string name, object value); + void SetCollection(string name, IEnumerable<Instance> children); - [Obsolete] - void SetChildArray(string name, Type type, Instance[] children); + string GetProperty(string propertyName); } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/IEnumerableCoercion.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/IEnumerableCoercion.cs 2009-12-26 05:34:50 UTC (rev 292) +++ trunk/Source/StructureMap/Pipeline/IEnumerableCoercion.cs 2009-12-26 05:36:06 UTC (rev 293) @@ -1,3 +1,5 @@ +using System; +using System.Collections; using System.Collections.Generic; namespace StructureMap.Pipeline @@ -5,5 +7,6 @@ public interface IEnumerableCoercion { object Convert(IEnumerable<object> enumerable); + Type ElementType { get; } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/Instance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/Instance.cs 2009-12-26 05:34:50 UTC (rev 292) +++ trunk/Source/StructureMap/Pipeline/Instance.cs 2009-12-26 05:36:06 UTC (rev 293) @@ -27,6 +27,8 @@ Instance FindInstanceForProfile(PluginFamily family, string profileName, GraphLog log); InstanceToken CreateToken(); void Preprocess(PluginFamily family); + + [Obsolete("can go away")] void AddTemplatedInstanceTo(PluginFamily family, Type[] templateTypes); } @@ -53,6 +55,9 @@ set { _interceptor = value; } } + internal bool IsReference { get; set; } + internal bool CopyAsIsWhenClosingInstance { get; set; } + #region IDiagnosticInstance Members public string Name @@ -81,6 +86,7 @@ preprocess(family); } + [Obsolete("Can go")] void IDiagnosticInstance.AddTemplatedInstanceTo(PluginFamily family, Type[] templateTypes) { addTemplatedInstanceTo(family, templateTypes); @@ -150,6 +156,7 @@ return pluginType; } + [Obsolete("Can go")] protected virtual void addTemplatedInstanceTo(PluginFamily family, Type[] templateTypes) { if (canBePartOfPluginFamily(family)) @@ -204,6 +211,11 @@ { return false; } + + public virtual Instance CloseType(Type[] types) + { + return null; + } } /// <summary> Modified: trunk/Source/StructureMap/Pipeline/InstanceMementoPropertyReader.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/InstanceMementoPropertyReader.cs 2009-12-26 05:34:50 UTC (rev 292) +++ trunk/Source/StructureMap/Pipeline/InstanceMementoPropertyReader.cs 2009-12-26 05:36:06 UTC (rev 293) @@ -6,12 +6,12 @@ { public class InstanceMementoPropertyReader : IArgumentVisitor { - private readonly IConfiguredInstance _instance; + private readonly ConfiguredInstance _instance; private readonly InstanceMemento _memento; private readonly PluginGraph _pluginGraph; private readonly Type _pluginType; - public InstanceMementoPropertyReader(IConfiguredInstance instance, InstanceMemento memento, + public InstanceMementoPropertyReader(ConfiguredInstance instance, InstanceMemento memento, PluginGraph pluginGraph, Type pluginType) { _instance = instance; @@ -39,7 +39,7 @@ public void ChildSetter(PropertyInfo property, bool isMandatory) { - copyChild(property.Name, property.PropertyType, isMandatory); + copyChild(property.Name, property.PropertyType); } public void ChildArraySetter(PropertyInfo property, bool isMandatory) @@ -64,7 +64,7 @@ public void ChildParameter(ParameterInfo parameter) { - copyChild(parameter.Name, parameter.ParameterType, true); + copyChild(parameter.Name, parameter.ParameterType); } public void ChildArrayParameter(ParameterInfo parameter) @@ -83,14 +83,15 @@ throw new StructureMapException(205, name, _memento.InstanceKey); } - _instance.SetProperty(name, propertyValue); + _instance.SetValue(name, propertyValue); } - private void copyChild(string name, Type childType, bool isMandatory) + private void copyChild(string name, Type childType) { Instance childInstance = _memento.ReadChildInstance(name, _pluginGraph, childType); + if (childInstance == null) return; - _instance.Set(name, childInstance); + _instance.SetChild(name, childInstance); } private void copyChildArray(string name, Type childType) @@ -104,7 +105,7 @@ children[i] = memento.ReadInstance(_pluginGraph, childType); } - _instance.SetChildArray(name, childType, children); + _instance.SetCollection(name, children); } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/ListCoercion.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ListCoercion.cs 2009-12-26 05:34:50 UTC (rev 292) +++ trunk/Source/StructureMap/Pipeline/ListCoercion.cs 2009-12-26 05:36:06 UTC (rev 293) @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; @@ -9,5 +10,7 @@ { return enumerable.Select(x => x as T).ToList(); } + + public Type ElementType { get { return typeof (T); } } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/ObjectInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ObjectInstance.cs 2009-12-26 05:34:50 UTC (rev 292) +++ trunk/Source/StructureMap/Pipeline/ObjectInstance.cs 2009-12-26 05:36:06 UTC (rev 293) @@ -23,6 +23,8 @@ public ObjectInstance(object anObject) { + CopyAsIsWhenClosingInstance = true; + if (anObject == null) { throw new ArgumentNullException("anObject"); Modified: trunk/Source/StructureMap/Pipeline/Profile.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/Profile.cs 2009-12-26 05:34:50 UTC (rev 292) +++ trunk/Source/StructureMap/Pipeline/Profile.cs 2009-12-26 05:36:06 UTC (rev 293) @@ -94,15 +94,23 @@ public void CopyDefault(Type sourceType, Type destinationType, PluginFamily family) { - if (_instances.ContainsKey(sourceType)) + if (!_instances.ContainsKey(sourceType)) return; + + var sourceInstance = _instances[sourceType]; + if (sourceInstance.IsReference) { - Instance sourceInstance = _instances[sourceType]; - Instance destinationInstance = family.GetInstance(sourceInstance.Name); - if (destinationInstance != null) + _instances.Add(destinationType, sourceInstance); + } + else + { + family.ForInstance(sourceInstance.Name, x => { - _instances.Add(destinationType, destinationInstance); - } + _instances.Add(destinationType, x); + }); } + + + } Modified: trunk/Source/StructureMap/Pipeline/PropertyExpression.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/PropertyExpression.cs 2009-12-26 05:34:50 UTC (rev 292) +++ trunk/Source/StructureMap/Pipeline/PropertyExpression.cs 2009-12-26 05:36:06 UTC (rev 293) @@ -1,3 +1,4 @@ +using System; using System.Configuration; using StructureMap.TypeRules; @@ -6,12 +7,12 @@ /// <summary> /// Defines the value of a primitive argument to a constructur argument /// </summary> - public class PropertyExpression<T> where T : IConfiguredInstance + public class PropertyExpression<T> where T : ConstructorInstance { - private readonly IConfiguredInstance _instance; + private readonly ConstructorInstance _instance; private readonly string _propertyName; - public PropertyExpression(IConfiguredInstance instance, string propertyName) + public PropertyExpression(ConstructorInstance instance, string propertyName) { _instance = instance; _propertyName = propertyName; @@ -24,12 +25,8 @@ /// <returns></returns> public T EqualTo(object propertyValue) { - if(propertyValue.GetType().IsSimple()) - _instance.SetProperty(_propertyName, propertyValue.ToString()); - else - { - _instance.Set(_propertyName,new ObjectInstance(propertyValue)); - } + _instance.SetValue(_propertyName, propertyValue); + return (T) _instance; } @@ -51,11 +48,12 @@ /// <param name="appSettingKey">The key in appSettings for the value to use.</param> /// <param name="defaultValue">The value to use if an entry for <paramref name="appSettingKey"/> does not exist in the appSettings section.</param> /// <returns></returns> + [Obsolete("Change to using a func to get this")] public T EqualToAppSetting(string appSettingKey, string defaultValue) { string propertyValue = ConfigurationManager.AppSettings[appSettingKey]; if (propertyValue == null) propertyValue = defaultValue; - _instance.SetProperty(_propertyName, propertyValue); + _instance.SetValue(_propertyName, propertyValue); return (T)_instance; } } Modified: trunk/Source/StructureMap/Pipeline/ReferencedInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ReferencedInstance.cs 2009-12-26 05:34:50 UTC (rev 292) +++ trunk/Source/StructureMap/Pipeline/ReferencedInstance.cs 2009-12-26 05:36:06 UTC (rev 293) @@ -11,6 +11,9 @@ public ReferencedInstance(string referenceKey) { + IsReference = true; + CopyAsIsWhenClosingInstance = true; + if (string.IsNullOrEmpty(referenceKey)) { throw new ArgumentNullException("referenceKey"); Modified: trunk/Source/StructureMap/Pipeline/SmartInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/SmartInstance.cs 2009-12-26 05:34:50 UTC (rev 292) +++ trunk/Source/StructureMap/Pipeline/SmartInstance.cs 2009-12-26 05:36:06 UTC (rev 293) @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq.Expressions; using StructureMap.Configuration.DSL.Expressions; using StructureMap.Graph; @@ -11,11 +12,11 @@ /// Instance that builds objects with by calling constructor functions and using setter properties /// </summary> /// <typeparam name="T">The concrete type constructed by SmartInstance</typeparam> - public class SmartInstance<T> : ConfiguredInstanceBase<SmartInstance<T>> + public class SmartInstance<T> : ConstructorInstance { private readonly List<Action<T>> _actions = new List<Action<T>>(); - public SmartInstance() : base(typeof (T)) + public SmartInstance() : base(typeof(T)) { } @@ -125,11 +126,6 @@ return this; } - protected override string getDescription() - { - return "Smart Instance for " + getConcreteType(null).FullName; - } - /// <summary> /// Define a primitive constructor argument /// </summary> @@ -253,7 +249,7 @@ Plugin plugin = PluginCache.GetPlugin(typeof (T)); string propertyName = plugin.FindArgumentNameForType(typeof (CHILD).MakeArrayType()); - + Debug.WriteLine("Property Name: " + propertyName); return TheArrayOf<CHILD>(propertyName); } @@ -298,7 +294,7 @@ var child = new InstanceExpression<ARRAY>(list.Add); action(child); - _instance.setChildArray(_propertyName, list.ToArray()); + _instance.SetCollection(_propertyName, list); return _instance; } @@ -306,11 +302,11 @@ /// <summary> /// Specify an array of Instance objects directly for an Array dependency /// </summary> - /// <param name="arrayInstances"></param> + /// <param name="children"></param> /// <returns></returns> - public SmartInstance<T> Contains(params Instance[] arrayInstances) + public SmartInstance<T> Contains(params Instance[] children) { - _instance.setChildArray(_propertyName, arrayInstances); + _instance.SetCollection(_propertyName, children); return _instance; } @@ -342,7 +338,7 @@ /// <returns></returns> public SmartInstance<T> Is(Action<IInstanceExpression<CHILD>> action) { - var expression = new InstanceExpression<CHILD>(i => _instance.setChild(_propertyName, i)); + var expression = new InstanceExpression<CHILD>(i => _instance.SetChild(_propertyName, i)); action(expression); return _instance; @@ -355,7 +351,7 @@ /// <returns></returns> public SmartInstance<T> Is(Instance instance) { - _instance.setChild(_propertyName, instance); + _instance.SetChild(_propertyName, instance); return _instance; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-12-26 05:34:56
|
Revision: 292 http://structuremap.svn.sourceforge.net/structuremap/?rev=292&view=rev Author: jeremydmiller Date: 2009-12-26 05:34:50 +0000 (Sat, 26 Dec 2009) Log Message: ----------- The big, big, big switch from IL generation to dynamic Func's. Ding dong, the witch is dead. Modified Paths: -------------- trunk/Source/StructureMap/Graph/Constructor.cs trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs trunk/Source/StructureMap/Graph/IHeavyweightTypeScanner.cs trunk/Source/StructureMap/Graph/Plugin.cs trunk/Source/StructureMap/Graph/PluginCache.cs trunk/Source/StructureMap/Graph/PluginFamily.cs trunk/Source/StructureMap/Graph/SetterPropertyCollection.cs Modified: trunk/Source/StructureMap/Graph/Constructor.cs =================================================================== --- trunk/Source/StructureMap/Graph/Constructor.cs 2009-12-26 05:34:29 UTC (rev 291) +++ trunk/Source/StructureMap/Graph/Constructor.cs 2009-12-26 05:34:50 UTC (rev 292) @@ -8,8 +8,8 @@ { public class Constructor { - private ConstructorInfo _ctor; private readonly Type _pluggedType; + private ConstructorInfo _ctor; public Constructor(Type pluggedType) { @@ -17,10 +17,7 @@ _ctor = GetConstructor(pluggedType); } - public ConstructorInfo Ctor - { - get { return _ctor; } - } + public ConstructorInfo Ctor { get { return _ctor; } } /// <summary> /// Returns the System.Reflection.ConstructorInfo for the PluggedType. Uses either @@ -102,11 +99,8 @@ catch (Exception e) { string message = - "Trying to visit parameter {0} of type {1} in the constructor for {2}".ToFormat(info.Name, - info. - ParameterType, - _pluggedType. - AssemblyQualifiedName); + "Trying to visit parameter {0} of type {1} in the constructor for {2}" + .ToFormat(info.Name, info.ParameterType, _pluggedType.AssemblyQualifiedName); throw new ApplicationException(message, e); } } @@ -144,7 +138,7 @@ var finder = new ConstructorFinderVisitor(); finder.Visit(expression); - var ctor = finder.Constructor; + ConstructorInfo ctor = finder.Constructor; if (ctor == null) { throw new ApplicationException("Not a valid constructor function"); Modified: trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs =================================================================== --- trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs 2009-12-26 05:34:29 UTC (rev 291) +++ trunk/Source/StructureMap/Graph/GenericsPluginGraph.cs 2009-12-26 05:34:50 UTC (rev 292) @@ -100,7 +100,8 @@ Type[] templatedParameterTypes = templatedType.GetGenericArguments(); - PluginFamily family = CreateTemplatedClone(basicFamily, templatedParameterTypes); + PluginFamily templatedFamily = basicFamily.CreateTemplatedClone(templatedParameterTypes); + PluginFamily family = templatedFamily; profileManager.CopyDefaults(basicType, templatedType, family); return family; @@ -111,12 +112,6 @@ } } - // TODO: This code sucks. What's going on here? - public static PluginFamily CreateTemplatedClone(PluginFamily baseFamily, params Type[] templateTypes) - { - PluginFamily templatedFamily = baseFamily.CreateTemplatedClone(templateTypes); - return templatedFamily; - } public static bool CanBePluggedIntoGenericType(Type pluginType, Type pluggedType, params Type[] templateTypes) @@ -149,10 +144,7 @@ public void ImportFrom(GenericsPluginGraph source) { - foreach (PluginFamily sourceFamily in source._families) - { - ImportFrom(sourceFamily); - } + source._families.Each(ImportFrom); } public void ImportFrom(PluginFamily sourceFamily) Modified: trunk/Source/StructureMap/Graph/IHeavyweightTypeScanner.cs =================================================================== --- trunk/Source/StructureMap/Graph/IHeavyweightTypeScanner.cs 2009-12-26 05:34:29 UTC (rev 291) +++ trunk/Source/StructureMap/Graph/IHeavyweightTypeScanner.cs 2009-12-26 05:34:50 UTC (rev 292) @@ -42,18 +42,22 @@ private IEnumerable<Type> FindPluginTypes(Type type) { + return new Type[0]; // lets not worry about abstract base classes for now return type.GetInterfaces().Where(t => t.IsPublic); } public IEnumerable<TypeMap> GetTypeMaps() { - return _implementations.Contents().Select(pair => new TypeMap(pair.Key, pair.Value)); + return new TypeMap[0]; + throw new NotImplementedException(); + //return _implementations.Contents().Select(pair => new TypeMap(pair.Key, pair.Value)); } public void Dispose() { - _implementations.Clear(); + //throw new NotImplementedException(); + //_implementations.Clear(); } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Graph/Plugin.cs =================================================================== --- trunk/Source/StructureMap/Graph/Plugin.cs 2009-12-26 05:34:29 UTC (rev 291) +++ trunk/Source/StructureMap/Graph/Plugin.cs 2009-12-26 05:34:50 UTC (rev 292) @@ -176,5 +176,7 @@ { return _constructor.FindArgumentType(argumentName) ?? _setters.FindArgumentType(argumentName); } + + } } \ No newline at end of file Modified: trunk/Source/StructureMap/Graph/PluginCache.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginCache.cs 2009-12-26 05:34:29 UTC (rev 291) +++ trunk/Source/StructureMap/Graph/PluginCache.cs 2009-12-26 05:34:50 UTC (rev 292) @@ -2,15 +2,14 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; -using StructureMap.Emitting; +using StructureMap.Construction; using StructureMap.Util; -using StructureMap.TypeRules; namespace StructureMap.Graph { public static class PluginCache { - private static readonly Cache<Type, InstanceBuilder> _builders; + private static readonly Cache<Type, IInstanceBuilder> _builders; private static readonly Cache<Type, Plugin> _plugins; private static readonly List<Predicate<PropertyInfo>> _setterRules; @@ -29,16 +28,16 @@ }); - _builders = new Cache<Type, InstanceBuilder>(t => + _builders = new Cache<Type, IInstanceBuilder>(t => { try { Plugin plugin = _plugins[t]; - return new InstanceBuilderAssembly(new[] {plugin}).Compile()[0]; + return BuilderCompiler.CreateBuilder(plugin); } catch (Exception e) { - throw new StructureMapException(245, t.AssemblyQualifiedName, e); + throw new StructureMapException(245, e, t.AssemblyQualifiedName); } }); } @@ -48,41 +47,11 @@ return _plugins[pluggedType]; } - public static InstanceBuilder FindBuilder(Type pluggedType) + public static IInstanceBuilder FindBuilder(Type pluggedType) { return _builders[pluggedType]; } - public static void Compile() - { - lock (typeof (PluginCache)) - { - IEnumerable<Plugin> plugins = - _plugins.Where(plugin => pluginHasNoBuilder(plugin) && plugin.CanBeCreated()); - createAndStoreBuilders(plugins); - } - } - - private static void createAndStoreBuilders(IEnumerable<Plugin> plugins) - { - // If this is a nested container and there are no new plugins, - // we don't need to create the InstanceBuilderAssembly - // This was causing OutOfMemoryExceptions when using nested containers - // repeatedly (i.e. every web request in a web app) - if (plugins == null || plugins.Count() == 0) return; - - //NOTE: Calling 'Compile()' on a DynamicAssembly will actually - // compile it as a file on the disk and load it into the AppDomain. - // If you call it repeatedly, you will eventually run out of memory - var assembly = new InstanceBuilderAssembly(plugins); - assembly.Compile().ForEach(b => _builders[b.PluggedType] = b); - } - - private static bool pluginHasNoBuilder(Plugin plugin) - { - return !_builders.Has(plugin.PluggedType); - } - public static void Store(Type pluggedType, InstanceBuilder builder) { _builders[pluggedType] = builder; @@ -114,9 +83,7 @@ //does any of the registered plugins have a setter matching the predicate? if (plugin.PluggedType.GetProperties().Any(s => predicate(s))) { - //rebuild the builder if nessesary - if (_builders[plugin.PluggedType] != null) - createAndStoreBuilders(new[] { plugin }); + _builders.Remove(plugin.PluggedType); } }); Modified: trunk/Source/StructureMap/Graph/PluginFamily.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginFamily.cs 2009-12-26 05:34:29 UTC (rev 291) +++ trunk/Source/StructureMap/Graph/PluginFamily.cs 2009-12-26 05:34:50 UTC (rev 292) @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using StructureMap.Attributes; using StructureMap.Pipeline; using StructureMap.TypeRules; @@ -14,7 +15,10 @@ /// </summary> public class PluginFamily : IPluginFamily { - private readonly Cache<string, Instance> _instances = new Cache<string, Instance>(delegate { return null; }); + private readonly Cache<string, Instance> _instances = new Cache<string, Instance>(delegate + { + return null; + }); private readonly List<InstanceMemento> _mementoList = new List<InstanceMemento>(); private readonly Cache<string, Plugin> _pluggedTypes = new Cache<string, Plugin>(); private readonly Type _pluginType; @@ -148,10 +152,15 @@ if (hasInstanceWithPluggedType(plugin)) return; ConfiguredInstance instance = new ConfiguredInstance(plugin.PluggedType).WithName(key); - AddInstance(instance); + FillInstance(instance); }); } + private void FillInstance(Instance instance) + { + _instances.Fill(instance.Name, instance); + } + private bool hasInstanceWithPluggedType(Plugin plugin) { return _instances.Exists(instance => instance.Matches(plugin)); @@ -280,9 +289,14 @@ templatedFamily.DefaultInstanceKey = DefaultInstanceKey; templatedFamily._lifecycle = _lifecycle; + _instances.GetAll().Select(x => + { + var clone = x.CloseType(templateTypes); + if (clone == null) return null; - // TODO -- Got a big problem here. Intances need to be copied over - EachInstance(i => { ((IDiagnosticInstance) i).AddTemplatedInstanceTo(templatedFamily, templateTypes); }); + clone.Name = x.Name; + return clone; + }).Where(x => x != null).Each(templatedFamily.AddInstance); // Need to attach the new PluginFamily to the old PluginGraph Parent.PluginFamilies.Add(templatedFamily); @@ -365,5 +379,10 @@ public Instance MissingInstance { get; set; } #endregion + + public void ForInstance(string name, Action<Instance> action) + { + _instances.WithValue(name, action); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Graph/SetterPropertyCollection.cs =================================================================== --- trunk/Source/StructureMap/Graph/SetterPropertyCollection.cs 2009-12-26 05:34:29 UTC (rev 291) +++ trunk/Source/StructureMap/Graph/SetterPropertyCollection.cs 2009-12-26 05:34:50 UTC (rev 292) @@ -19,14 +19,14 @@ _properties = new List<SetterProperty>(); _plugin = plugin; - foreach (PropertyInfo property in plugin.PluggedType.GetProperties(BindingFlags.Public | BindingFlags.Instance)) - { - if (property.CanWrite && property.GetSetMethod(false) != null) + + plugin.PluggedType.GetProperties(BindingFlags.Public | BindingFlags.Instance) + .Where(x => x.CanWrite && x.GetSetMethod(false) != null && x.GetSetMethod().GetParameters().Length == 1) + .Each(x => { - var setter = new SetterProperty(property); + var setter = new SetterProperty(x); _properties.Add(setter); - } - } + }); } public int MandatoryCount This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-12-26 05:34:38
|
Revision: 291 http://structuremap.svn.sourceforge.net/structuremap/?rev=291&view=rev Author: jeremydmiller Date: 2009-12-26 05:34:29 +0000 (Sat, 26 Dec 2009) Log Message: ----------- The big, big, big switch from IL generation to dynamic Func's. Ding dong, the witch is dead. Removed Paths: ------------- trunk/Source/StructureMap/Emitting/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-12-26 05:33:50
|
Revision: 290 http://structuremap.svn.sourceforge.net/structuremap/?rev=290&view=rev Author: jeremydmiller Date: 2009-12-26 05:33:42 +0000 (Sat, 26 Dec 2009) Log Message: ----------- The big, big, big switch from IL generation to dynamic Func's. Ding dong, the witch is dead. Added Paths: ----------- trunk/Source/StructureMap/Construction/ trunk/Source/StructureMap/Construction/BuilderCompiler.cs trunk/Source/StructureMap/Construction/ConstructorFunctionBuilder.cs trunk/Source/StructureMap/Construction/IArguments.cs trunk/Source/StructureMap/Construction/InstanceBuilder.cs trunk/Source/StructureMap/Construction/SetterBuilder.cs Added: trunk/Source/StructureMap/Construction/BuilderCompiler.cs =================================================================== --- trunk/Source/StructureMap/Construction/BuilderCompiler.cs (rev 0) +++ trunk/Source/StructureMap/Construction/BuilderCompiler.cs 2009-12-26 05:33:42 UTC (rev 290) @@ -0,0 +1,113 @@ +using System; +using System.Linq; +using System.Reflection; +using StructureMap.Graph; + +namespace StructureMap.Construction +{ + public class BuilderCompiler + { + public static InstanceBuilder CreateBuilder(Plugin plugin) + { + return getCompiler(plugin).CreateBuilder(plugin); + } + + public static Func<IArguments, object> CompileCreator(Plugin plugin) + { + FuncCompiler compiler = getCompiler(plugin); + + return compiler.Compile(plugin); + } + + private static FuncCompiler getCompiler(Plugin plugin) + { + var compilerType = typeof (FuncCompiler<>).MakeGenericType(plugin.PluggedType); + return (FuncCompiler)Activator.CreateInstance(compilerType); + } + + public static Action<IArguments, object> CompileBuildUp(Plugin plugin) + { + FuncCompiler compiler = getCompiler(plugin); + + return compiler.BuildUp(plugin); + } + + public interface FuncCompiler + { + Func<IArguments, object> Compile(Plugin plugin); + Action<IArguments, object> BuildUp(Plugin plugin); + + InstanceBuilder CreateBuilder(Plugin plugin); + } + + public class FuncCompiler<T> : FuncCompiler + { + private readonly SetterBuilder<T> _setterBuilder = new SetterBuilder<T>(); + + public InstanceBuilder CreateBuilder(Plugin plugin) + { + var ctor = new ConstructorFunctionBuilder<T>().CreateBuilder(plugin); + var setters = this.buildUp(plugin); + + Func<IArguments, object> creator = args => + { + var target = ctor(args); + setters(args, target); + return target; + }; + + Action<IArguments, object> builder = (args, o) => setters(args, (T) o); + + return new InstanceBuilder(plugin.PluggedType, creator, builder); + } + + public Func<IArguments, object> Compile(Plugin plugin) + { + var ctor = new ConstructorFunctionBuilder<T>().CreateBuilder(plugin); + var buildUp = this.buildUp(plugin); + + return args => + { + // Call the constructor + var target = ctor(args); + buildUp(args, target); + + return target; + }; + } + + private Action<IArguments, T> buildUp(Plugin plugin) + { + var mandatories = plugin.Setters.Where(x => x.IsMandatory) + .Select(x => _setterBuilder.BuildMandatorySetter((PropertyInfo)x.Property)) + .ToArray(); + + + var optionals = plugin.Setters.Where(x => !x.IsMandatory) + .Select(x => _setterBuilder.BuildOptionalSetter(x.Property)) + .ToArray(); + + return (args, target) => + { + // Call the mandatory setters + for (int i = 0; i < mandatories.Length; i++) + { + mandatories[i](args, target); + } + + // Call the optional setters + for (int i = 0; i < optionals.Length; i++) + { + optionals[i](args, target); + } + }; + } + + public Action<IArguments, object> BuildUp(Plugin plugin) + { + var func = buildUp(plugin); + return (args, raw) => func(args, (T)raw); + } + } + } +} \ No newline at end of file Added: trunk/Source/StructureMap/Construction/ConstructorFunctionBuilder.cs =================================================================== --- trunk/Source/StructureMap/Construction/ConstructorFunctionBuilder.cs (rev 0) +++ trunk/Source/StructureMap/Construction/ConstructorFunctionBuilder.cs 2009-12-26 05:33:42 UTC (rev 290) @@ -0,0 +1,38 @@ +using System; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using StructureMap.Graph; + +namespace StructureMap.Construction +{ + public class ConstructorFunctionBuilder<T> + { + public Func<IArguments, T> CreateBuilder() + { + Plugin plugin = PluginCache.GetPlugin(typeof (T)); + return CreateBuilder(plugin); + } + + public Func<IArguments, T> CreateBuilder(Plugin plugin) + { + ConstructorInfo constructor = plugin.GetConstructor(); + + var args = Expression.Parameter(typeof (IArguments), "x"); + + + var arguments = constructor.GetParameters().Select(param => ToParameterValueGetter(args, param.ParameterType, param.Name)); + + var ctorCall = Expression.New(constructor, arguments); + + var lambda = Expression.Lambda(typeof (Func<IArguments, T>), ctorCall, args); + return (Func<IArguments, T>) lambda.Compile(); + } + + public static Expression ToParameterValueGetter(ParameterExpression args, Type type, string argName) + { + MethodInfo method = typeof(IArguments).GetMethod("Get").MakeGenericMethod(type); + return Expression.Call(args, method, Expression.Constant(argName)); + } + } +} \ No newline at end of file Added: trunk/Source/StructureMap/Construction/IArguments.cs =================================================================== --- trunk/Source/StructureMap/Construction/IArguments.cs (rev 0) +++ trunk/Source/StructureMap/Construction/IArguments.cs 2009-12-26 05:33:42 UTC (rev 290) @@ -0,0 +1,8 @@ +namespace StructureMap.Construction +{ + public interface IArguments + { + T Get<T>(string propertyName); + bool Has(string propertyName); + } +} \ No newline at end of file Copied: trunk/Source/StructureMap/Construction/InstanceBuilder.cs (from rev 284, trunk/Source/StructureMap/InstanceBuilder.cs) =================================================================== --- trunk/Source/StructureMap/Construction/InstanceBuilder.cs (rev 0) +++ trunk/Source/StructureMap/Construction/InstanceBuilder.cs 2009-12-26 05:33:42 UTC (rev 290) @@ -0,0 +1,46 @@ +using System; +using StructureMap.Pipeline; + +namespace StructureMap.Construction +{ + public interface IInstanceBuilder + { + Type PluggedType { get; } + object BuildInstance(IArguments args); + void BuildUp(IArguments args, object target); + } + + /// <summary> + /// Base class for creating an object instance from an InstanceMemento. SubClasses are + /// emitted for each concrete Plugin with constructor parameters. + /// </summary> + public class InstanceBuilder : IInstanceBuilder + { + private readonly Type _pluggedType; + private readonly Func<IArguments, object> _constructor; + private readonly Action<IArguments, object> _buildUp; + + public InstanceBuilder(Type pluggedType, Func<IArguments, object> constructor, Action<IArguments, object> buildUp) + { + _pluggedType = pluggedType; + _constructor = constructor; + _buildUp = buildUp; + } + + public Type PluggedType { get + { + return _pluggedType; + } + } + + public virtual object BuildInstance(IArguments args) + { + return _constructor(args); + } + + public virtual void BuildUp(IArguments args, object target) + { + _buildUp(args, target); + } + } +} \ No newline at end of file Added: trunk/Source/StructureMap/Construction/SetterBuilder.cs =================================================================== --- trunk/Source/StructureMap/Construction/SetterBuilder.cs (rev 0) +++ trunk/Source/StructureMap/Construction/SetterBuilder.cs 2009-12-26 05:33:42 UTC (rev 290) @@ -0,0 +1,47 @@ +using System; +using System.Linq.Expressions; +using System.Reflection; + +namespace StructureMap.Construction +{ + public class SetterBuilder<T> + { + public Action<IArguments, T> BuildMandatorySetter(string propertyName) + { + PropertyInfo property = typeof (T).GetProperty(propertyName); + return BuildMandatorySetter(property); + } + + public Action<IArguments, T> BuildMandatorySetter(PropertyInfo property) + { + var args = Expression.Parameter(typeof (IArguments), "args"); + var target = Expression.Parameter(typeof (T), "target"); + + + var getValue = ConstructorFunctionBuilder<T>.ToParameterValueGetter(args, property.PropertyType, property.Name); + var method = property.GetSetMethod(); + + var callSetMethod = Expression.Call(target, method, getValue); + + var lambda = Expression.Lambda(typeof (Action<IArguments, T>), callSetMethod, args, target); + + return (Action<IArguments, T>) lambda.Compile(); + } + + public Action<IArguments, T> BuildOptionalSetter(PropertyInfo property) + { + var name = property.Name; + var func = BuildMandatorySetter(property); + return (args, target) => + { + if (args.Has(name)) func(args, target); + }; + } + + public Action<IArguments, T> BuildOptionalSetter(string propertyName) + { + PropertyInfo property = typeof(T).GetProperty(propertyName); + return BuildOptionalSetter(property); + } + } +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-12-26 05:33:18
|
Revision: 289 http://structuremap.svn.sourceforge.net/structuremap/?rev=289&view=rev Author: jeremydmiller Date: 2009-12-26 05:33:04 +0000 (Sat, 26 Dec 2009) Log Message: ----------- The big, big, big switch from IL generation to dynamic Func's. Ding dong, the witch is dead. Modified Paths: -------------- trunk/Source/StructureMap.Testing.Widget5/StructureMap.Testing.Widget5.csproj Removed Paths: ------------- trunk/Source/StructureMap.Testing.Widget5/BasicGridColumnInstanceBuilder.cs Deleted: trunk/Source/StructureMap.Testing.Widget5/BasicGridColumnInstanceBuilder.cs =================================================================== --- trunk/Source/StructureMap.Testing.Widget5/BasicGridColumnInstanceBuilder.cs 2009-12-26 05:32:47 UTC (rev 288) +++ trunk/Source/StructureMap.Testing.Widget5/BasicGridColumnInstanceBuilder.cs 2009-12-26 05:33:04 UTC (rev 289) @@ -1,43 +0,0 @@ -using System; -using StructureMap.Pipeline; -using StructureMap.Testing.Widget; - -namespace StructureMap.Testing.Widget5 -{ - /// <summary> - /// Used just to generate the template for IL generation - /// </summary> - public class BasicGridColumnInstanceBuilder : InstanceBuilder - { - public BasicGridColumnInstanceBuilder() : base() - { - } - - public override Type PluggedType - { - get { throw new NotImplementedException(); } - } - - public override object BuildInstance(IConfiguredInstance instance, BuildSession session) - { - BasicGridColumn column = new BasicGridColumn(instance.GetProperty("headerText")); - -// column.Widget = -// (IWidget) Memento.GetChild("Widget", "StructureMap.Testing.Widget.IWidget", this.Manager); -// -// column.FontStyle = -// (FontStyleEnum) Enum.Parse( typeof ( FontStyleEnum ), Memento.GetProperty( "FontStyle" ), true ); - -// column.ColumnName = Memento.GetProperty("ColumnName"); - - column.Rules = - (Rule[]) - session.CreateInstanceArray(typeof(Rule), instance.GetChildrenArray("Rules")); - -// -// column.WrapLines = bool.Parse(Memento.GetProperty("WrapLines")); - - return column; - } - } -} \ No newline at end of file Modified: trunk/Source/StructureMap.Testing.Widget5/StructureMap.Testing.Widget5.csproj =================================================================== --- trunk/Source/StructureMap.Testing.Widget5/StructureMap.Testing.Widget5.csproj 2009-12-26 05:32:47 UTC (rev 288) +++ trunk/Source/StructureMap.Testing.Widget5/StructureMap.Testing.Widget5.csproj 2009-12-26 05:33:04 UTC (rev 289) @@ -1,7 +1,7 @@ <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5"> <PropertyGroup> <ProjectType>Local</ProjectType> - <ProductVersion>9.0.21022</ProductVersion> + <ProductVersion>9.0.30729</ProductVersion> <SchemaVersion>2.0</SchemaVersion> <ProjectGuid>{CAB97F7F-FB75-410C-898A-88DCAAC036BE}</ProjectGuid> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> @@ -131,9 +131,6 @@ <Compile Include="BasicGridColumn.cs"> <SubType>Code</SubType> </Compile> - <Compile Include="BasicGridColumnInstanceBuilder.cs"> - <SubType>Code</SubType> - </Compile> <Compile Include="CannotBeAutoFilledGridColumn.cs"> <SubType>Code</SubType> </Compile> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-12-26 05:32:53
|
Revision: 288 http://structuremap.svn.sourceforge.net/structuremap/?rev=288&view=rev Author: jeremydmiller Date: 2009-12-26 05:32:47 +0000 (Sat, 26 Dec 2009) Log Message: ----------- The big, big, big switch from IL generation to dynamic Func's. Ding dong, the witch is dead. Modified Paths: -------------- trunk/Source/StructureMap.Testing.Widget2/EnumerationCheck.cs Modified: trunk/Source/StructureMap.Testing.Widget2/EnumerationCheck.cs =================================================================== --- trunk/Source/StructureMap.Testing.Widget2/EnumerationCheck.cs 2009-12-26 05:32:30 UTC (rev 287) +++ trunk/Source/StructureMap.Testing.Widget2/EnumerationCheck.cs 2009-12-26 05:32:47 UTC (rev 288) @@ -26,63 +26,6 @@ } - public class CowBuilder : InstanceBuilder - { - public Type ThePluginType - { - get - { - return typeof (Cow); - } - } - - public override Type PluggedType - { - get { return typeof (Cow); } - } - - - public override object BuildInstance(IConfiguredInstance instance, BuildSession session) - { - return new Cow( - long.Parse(instance.GetProperty("Weight")), - (BreedEnum) Enum.Parse(typeof (BreedEnum), instance.GetProperty("Breed"), true), - instance.GetProperty("Name")); - } - } - - public class SetterBuilder : InstanceBuilder - { - public override Type PluggedType - { - get { throw new System.NotImplementedException(); } - } - - public override object BuildInstance(IConfiguredInstance instance, BuildSession session) - { - SetterTarget target = new SetterTarget(); - - - //instance.ForProperty("Name", s => ); - //target.Name = instance.GetProperty("Name"); - //if (instance.HasProperty("Name")) target.Name = instance.GetProperty("Name"); - //if (instance.HasProperty("Name2")) target.Name = instance.GetProperty("Name2"); - //if (instance.HasProperty("Age")) target.Age = (int)Convert.ChangeType(instance.GetProperty("Age"), typeof(int)); - //if (instance.HasProperty("Breed")) target.Breed = (BreedEnum)Enum.Parse(typeof(BreedEnum), instance.GetProperty("Breed"), true); - - //instance.ForProperty("Name", x => target.Name = x); - //instance.ForProperty("Age", x => target.Age = (int)Convert.ChangeType(x, typeof (int))); - //instance.ForProperty("Breed", x => target.Breed = (BreedEnum) Enum.Parse(typeof (BreedEnum), x)); - - return target; - } - - private void setNameProperty(SetterTarget target, string text) - { - target.Name = text; - } - } - public class SetterTarget { public string Name { get; set; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-12-26 05:32:40
|
Revision: 287 http://structuremap.svn.sourceforge.net/structuremap/?rev=287&view=rev Author: jeremydmiller Date: 2009-12-26 05:32:30 +0000 (Sat, 26 Dec 2009) Log Message: ----------- The big, big, big switch from IL generation to dynamic Func's. Ding dong, the witch is dead. Modified Paths: -------------- trunk/Source/StructureMap.Testing.Widget/ArrayConstruction.cs trunk/Source/StructureMap.Testing.Widget/BuilderSamples.cs trunk/Source/StructureMap.Testing.Widget/Decision.cs trunk/Source/StructureMap.Testing.Widget/Hierarchy.cs trunk/Source/StructureMap.Testing.Widget/Rule.cs Modified: trunk/Source/StructureMap.Testing.Widget/ArrayConstruction.cs =================================================================== --- trunk/Source/StructureMap.Testing.Widget/ArrayConstruction.cs 2009-12-26 05:32:08 UTC (rev 286) +++ trunk/Source/StructureMap.Testing.Widget/ArrayConstruction.cs 2009-12-26 05:32:30 UTC (rev 287) @@ -48,18 +48,4 @@ #endregion } - - public class StringListBuilder : InstanceBuilder - { - public override object BuildInstance(IConfiguredInstance instance, BuildSession session) - { - return null; - } - - - public override Type PluggedType - { - get { return null; } - } - } } \ No newline at end of file Modified: trunk/Source/StructureMap.Testing.Widget/BuilderSamples.cs =================================================================== --- trunk/Source/StructureMap.Testing.Widget/BuilderSamples.cs 2009-12-26 05:32:08 UTC (rev 286) +++ trunk/Source/StructureMap.Testing.Widget/BuilderSamples.cs 2009-12-26 05:32:30 UTC (rev 287) @@ -21,55 +21,43 @@ public Color Color { get; set; } } - public class BuilderWithNoSetters : InstanceBuilder - { - public override Type PluggedType - { - get { throw new System.NotImplementedException(); } - } - public override object BuildInstance(IConfiguredInstance instance, BuildSession session) - { - SetterTarget target = new SetterTarget(); - return target; - } - } - public class BuilderWithOneSetter : InstanceBuilder - { - public override Type PluggedType - { - get { throw new System.NotImplementedException(); } - } + //public class BuilderWithOneSetter : InstanceBuilder + //{ + // public override Type PluggedType + // { + // get { throw new System.NotImplementedException(); } + // } - public override object BuildInstance(IConfiguredInstance instance, BuildSession session) - { - SetterTarget target = new SetterTarget(); - if (instance.HasProperty("Name")) target.Name = instance.GetProperty("Name"); - return target; - } - } + // public override object BuildInstance(IConfiguredInstance instance, BuildSession session) + // { + // SetterTarget target = new SetterTarget(); + // if (instance.HasProperty("Name", null)) target.Name = instance.GetProperty("Name"); + // return target; + // } + //} - public class BuilderWithTwoSetters : InstanceBuilder - { - public override Type PluggedType - { - get { throw new System.NotImplementedException(); } - } + //public class BuilderWithTwoSetters : InstanceBuilder + //{ + // public override Type PluggedType + // { + // get { throw new System.NotImplementedException(); } + // } - public override object BuildInstance(IConfiguredInstance instance, BuildSession session) - { - SetterTarget target = new SetterTarget(); - if (instance.HasProperty("Name")) target.Name = instance.GetProperty("Name"); - if (instance.HasProperty("Name2")) target.Name = instance.GetProperty("Name2"); - return target; - } + // public override object BuildInstance(IConfiguredInstance instance, BuildSession session) + // { + // SetterTarget target = new SetterTarget(); + // if (instance.HasProperty("Name", null)) target.Name = instance.GetProperty("Name"); + // if (instance.HasProperty("Name2", null)) target.Name = instance.GetProperty("Name2"); + // return target; + // } - public override void BuildUp(IConfiguredInstance instance, BuildSession session, object target) - { - SetterTarget x = (SetterTarget) target; - if (instance.HasProperty("Name")) x.Name = instance.GetProperty("Name"); - if (instance.HasProperty("Name2")) x.Name = instance.GetProperty("Name2"); - } - } + // public override void BuildUp(IConfiguredInstance instance, BuildSession session, object target) + // { + // SetterTarget x = (SetterTarget) target; + // if (instance.HasProperty("Name", null)) x.Name = instance.GetProperty("Name"); + // if (instance.HasProperty("Name2", null)) x.Name = instance.GetProperty("Name2"); + // } + //} } Modified: trunk/Source/StructureMap.Testing.Widget/Decision.cs =================================================================== --- trunk/Source/StructureMap.Testing.Widget/Decision.cs 2009-12-26 05:32:08 UTC (rev 286) +++ trunk/Source/StructureMap.Testing.Widget/Decision.cs 2009-12-26 05:32:30 UTC (rev 287) @@ -14,19 +14,4 @@ } } - - public class DecisionBuilder : InstanceBuilder - { - public override object BuildInstance(IConfiguredInstance instance, BuildSession session) - { - return new Decision( - (Rule[]) session.CreateInstanceArray(typeof(Rule), instance.GetChildrenArray("Rules"))); - } - - - public override Type PluggedType - { - get { return typeof (Decision); } - } - } } \ No newline at end of file Modified: trunk/Source/StructureMap.Testing.Widget/Hierarchy.cs =================================================================== --- trunk/Source/StructureMap.Testing.Widget/Hierarchy.cs 2009-12-26 05:32:08 UTC (rev 286) +++ trunk/Source/StructureMap.Testing.Widget/Hierarchy.cs 2009-12-26 05:32:30 UTC (rev 287) @@ -89,21 +89,4 @@ } } - - public class ChildLoaderTemplate : InstanceBuilder - { - public override Type PluggedType - { - get { throw new NotImplementedException(); } - } - - - public override object BuildInstance(IConfiguredInstance instance, BuildSession session) - { - var target = new Child( - instance.GetProperty("Name"), - (GrandChild) instance.Get("MyGrandChild", typeof(GrandChild), session)); - return target; - } - } } \ No newline at end of file Modified: trunk/Source/StructureMap.Testing.Widget/Rule.cs =================================================================== --- trunk/Source/StructureMap.Testing.Widget/Rule.cs 2009-12-26 05:32:08 UTC (rev 286) +++ trunk/Source/StructureMap.Testing.Widget/Rule.cs 2009-12-26 05:32:30 UTC (rev 287) @@ -94,13 +94,13 @@ IConfiguredInstance instance = memento; - instance.SetProperty("String", "Red"); - instance.SetProperty("String2", "Green"); - instance.SetProperty("Int", "1"); - instance.SetProperty("Long", "2"); - instance.SetProperty("Byte", "3"); - instance.SetProperty("Double", "4"); - instance.SetProperty("Bool", "true"); + instance.SetValue("String", "Red"); + instance.SetValue("String2", "Green"); + instance.SetValue("Int", "1"); + instance.SetValue("Long", "2"); + instance.SetValue("Byte", "3"); + instance.SetValue("Double", "4"); + instance.SetValue("Bool", "true"); return memento; } @@ -118,6 +118,8 @@ _Color = color; } + public string Name { get; set; } + public int Age { get; set; } public string Color { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-12-26 05:32:18
|
Revision: 286 http://structuremap.svn.sourceforge.net/structuremap/?rev=286&view=rev Author: jeremydmiller Date: 2009-12-26 05:32:08 +0000 (Sat, 26 Dec 2009) Log Message: ----------- The big, big, big switch from IL generation to dynamic Func's. Ding dong, the witch is dead. Modified Paths: -------------- trunk/Source/StructureMap.Testing/BuildUpTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/DeepInstanceTester.cs trunk/Source/StructureMap.Testing/Diagnostics/DoctorTester.cs trunk/Source/StructureMap.Testing/GenericsAcceptanceTester.cs trunk/Source/StructureMap.Testing/GenericsIntegrationTester.cs trunk/Source/StructureMap.Testing/Graph/ArrayConstructorTester.cs trunk/Source/StructureMap.Testing/Graph/GenericsPluginGraphTester.cs trunk/Source/StructureMap.Testing/Graph/SetterInjectionEmittingTester.cs trunk/Source/StructureMap.Testing/Graph/SingleImplementationScannerTester.cs trunk/Source/StructureMap.Testing/Graph/TestExplicitArguments.cs trunk/Source/StructureMap.Testing/InstanceMementoInstanceCreationTester.cs trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/DefaultInstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/EnumerableInstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs trunk/Source/StructureMap.Testing/Pipeline/SmartInstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/StubBuildSession.cs trunk/Source/StructureMap.Testing/SpecificationExtensions.cs trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj trunk/Source/StructureMap.Testing/StructureMapConfigurationTester.cs Added Paths: ----------- trunk/Source/StructureMap.Testing/Construction/ trunk/Source/StructureMap.Testing/Construction/BuilderCompilerTester.cs trunk/Source/StructureMap.Testing/Construction/ConstructorFunctionBuilderTester.cs trunk/Source/StructureMap.Testing/Construction/SetterBuilderTester.cs trunk/Source/StructureMap.Testing/Construction/StubArguments.cs Removed Paths: ------------- trunk/Source/StructureMap.Testing/Graph/EmittingTester.cs trunk/Source/StructureMap.Testing/InstanceBuilderListTester.cs Modified: trunk/Source/StructureMap.Testing/BuildUpTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/BuildUpTester.cs 2009-12-24 04:53:19 UTC (rev 285) +++ trunk/Source/StructureMap.Testing/BuildUpTester.cs 2009-12-26 05:32:08 UTC (rev 286) @@ -1,5 +1,6 @@ using NUnit.Framework; using StructureMap.Attributes; +using StructureMap.Construction; using StructureMap.Graph; using StructureMap.Pipeline; using StructureMap.Testing.Widget3; @@ -9,7 +10,7 @@ [TestFixture] public class BuildUpTester { - private InstanceBuilder builder; + private IInstanceBuilder builder; private SmartInstance<ClassWithMixOfSetters> instance; private ClassWithMixOfSetters _target; private BuildSession _session; @@ -36,8 +37,10 @@ if (_target == null) { _target = new ClassWithMixOfSetters(); - - builder.BuildUp(instance, _session, _target); + + var args = new Arguments(instance, _session); + + builder.BuildUp(args, _target); } return _target; Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/DeepInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/DeepInstanceTester.cs 2009-12-24 04:53:19 UTC (rev 285) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/DeepInstanceTester.cs 2009-12-26 05:32:08 UTC (rev 286) @@ -120,7 +120,6 @@ .CtorDependency<Rule>().Is(x => { x.OfConcreteType<WidgetRule>() - .WithCtorArg("color").EqualTo("yellow") .CtorDependency<IWidget>().Is( w => { w.OfConcreteType<ColorWidget>().WithProperty("color").EqualTo("yellow"); }); }); Added: trunk/Source/StructureMap.Testing/Construction/BuilderCompilerTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Construction/BuilderCompilerTester.cs (rev 0) +++ trunk/Source/StructureMap.Testing/Construction/BuilderCompilerTester.cs 2009-12-26 05:32:08 UTC (rev 286) @@ -0,0 +1,74 @@ +using System; +using NUnit.Framework; +using StructureMap.Construction; +using StructureMap.Graph; + +namespace StructureMap.Testing.Construction +{ + [TestFixture] + public class BuilderCompilerTester + { + [SetUp] + public void SetUp() + { + } + + [Test] + public void compile_and_exercise_a_builder() + { + var func = BuilderCompiler.CompileCreator(new Plugin(typeof (ConstructorTarget))); + var args = new StubArguments(); + args.Set("name", "Jeremy"); + args.Set("age", 35); + args.Set("birthDay", new DateTime(2009, 1, 1)); + + args.Set("Color", "blue"); + + var target = func(args).ShouldBeOfType<ConstructorTarget>(); + + target.Name.ShouldEqual("Jeremy"); + target.Age.ShouldEqual(35); + target.Color.ShouldEqual("blue"); + + // Optional wasn't filled in + target.Direction.ShouldBeNull(); + } + + [Test] + public void compile_and_exercise_build_up() + { + var args = new StubArguments(); + args.Set("Color", "blue"); + + var target = new ConstructorTarget(null, 5, DateTime.Today); + + var action = BuilderCompiler.CompileBuildUp(new Plugin(typeof (ConstructorTarget))); + action(args, target); + + target.Color.ShouldEqual("blue"); + } + + public class ConstructorTarget + { + private readonly string _name; + private readonly int _age; + private readonly DateTime _birthDay; + + public ConstructorTarget(string name, int age, DateTime birthDay) + { + _name = name; + _age = age; + _birthDay = birthDay; + } + + public string Name { get { return _name; } } + public int Age { get { return _age; } } + public DateTime BirthDay { get { return _birthDay; } } + + + public string Color { get; set; } + public string Direction { get; set; } + public int Number { get; set; } + } + } +} \ No newline at end of file Added: trunk/Source/StructureMap.Testing/Construction/ConstructorFunctionBuilderTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Construction/ConstructorFunctionBuilderTester.cs (rev 0) +++ trunk/Source/StructureMap.Testing/Construction/ConstructorFunctionBuilderTester.cs 2009-12-26 05:32:08 UTC (rev 286) @@ -0,0 +1,59 @@ +using System; +using NUnit.Framework; +using StructureMap.Construction; + +namespace StructureMap.Testing.Construction +{ + [TestFixture] + public class ConstructorFunctionBuilderTester + { + private Func<IArguments, ConstructorTarget> func; + + [SetUp] + public void SetUp() + { + var builder = new ConstructorFunctionBuilder<ConstructorTarget>(); + func = builder.CreateBuilder(); + } + + [Test] + public void build_an_object() + { + var args = new StubArguments(); + args.Set("name", "Jeremy"); + args.Set("age", 35); + + // That's actually correct, you know, just in case you want to buy me + // a birthday present + args.Set("birthDay", new DateTime(1974, 1, 1)); + + var target = func(args); + + target.Name.ShouldEqual("Jeremy"); + target.Age.ShouldEqual(35); + target.BirthDay.ShouldEqual(new DateTime(1974, 1, 1)); + } + + public class ConstructorTarget + { + private readonly string _name; + private readonly int _age; + private readonly DateTime _birthDay; + + public ConstructorTarget(string name, int age, DateTime birthDay) + { + _name = name; + _age = age; + _birthDay = birthDay; + } + + public string Name { get { return _name; } } + public int Age { get { return _age; } } + public DateTime BirthDay { get { return _birthDay; } } + + + public string Color { get; set; } + public int Number { get; set; } + } + } +} \ No newline at end of file Added: trunk/Source/StructureMap.Testing/Construction/SetterBuilderTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Construction/SetterBuilderTester.cs (rev 0) +++ trunk/Source/StructureMap.Testing/Construction/SetterBuilderTester.cs 2009-12-26 05:32:08 UTC (rev 286) @@ -0,0 +1,51 @@ +using NUnit.Framework; +using StructureMap.Construction; + +namespace StructureMap.Testing.Construction +{ + [TestFixture] + public class SetterBuilderTester + { + [Test] + public void build_and_execute_a_mandatory_setter() + { + var builder = new SetterBuilder<SetterTarget>(); + var func = builder.BuildMandatorySetter("Name"); + + var args = new StubArguments(); + args.Set("Name", "Max"); + + var target = new SetterTarget(); + func(args, target); + + target.Name.ShouldEqual("Max"); + } + + [Test] + public void build_and_execute_an_optional_setter() + { + var builder = new SetterBuilder<SetterTarget>(); + var func = builder.BuildOptionalSetter("Name"); + + var args = new StubArguments(); + var target = new SetterTarget(); + func(args, target); + + target.Name.ShouldBeNull(); + + + args.Set("Name", "Max"); + func(args, target); + + target.Name.ShouldEqual("Max"); + + } + + public class SetterTarget + { + public string Name { get; set; } + public int Age { get; set; } + public bool Active { get; set; } + } + } +} \ No newline at end of file Added: trunk/Source/StructureMap.Testing/Construction/StubArguments.cs =================================================================== --- trunk/Source/StructureMap.Testing/Construction/StubArguments.cs (rev 0) +++ trunk/Source/StructureMap.Testing/Construction/StubArguments.cs 2009-12-26 05:32:08 UTC (rev 286) @@ -0,0 +1,25 @@ +using StructureMap.Construction; +using StructureMap.Util; + +namespace StructureMap.Testing.Construction +{ + public class StubArguments : IArguments + { + private readonly Cache<string, object> _values = new Cache<string, object>(); + + public void Set(string propertyName, object value) + { + _values[propertyName] = value; + } + + public T Get<T>(string propertyName) + { + return (T)_values[propertyName]; + } + + public bool Has(string propertyName) + { + return _values.Has(propertyName); + } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Diagnostics/DoctorTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Diagnostics/DoctorTester.cs 2009-12-24 04:53:19 UTC (rev 285) +++ trunk/Source/StructureMap.Testing/Diagnostics/DoctorTester.cs 2009-12-26 05:32:08 UTC (rev 286) @@ -125,7 +125,7 @@ </configuration> "); - report.Result.ShouldEqual(DoctorResult.BuildErrors); + report.Result.ShouldEqual(DoctorResult.BootstrapperFailure); } [Test] Modified: trunk/Source/StructureMap.Testing/GenericsAcceptanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/GenericsAcceptanceTester.cs 2009-12-24 04:53:19 UTC (rev 285) +++ trunk/Source/StructureMap.Testing/GenericsAcceptanceTester.cs 2009-12-26 05:32:08 UTC (rev 286) @@ -145,18 +145,19 @@ [Test] public void Define_profile_with_generics_and_concrete_type() { - IContainer manager = new Container(registry => + var container = new Container(registry => { registry.CreateProfile("1").For(typeof (IService<>)).UseConcreteType(typeof (Service<>)); registry.CreateProfile("2").For(typeof (IService<>)).UseConcreteType(typeof (Service2<>)); }); - manager.SetDefaultsToProfile("1"); + container.SetDefaultsToProfile("1"); - Assert.IsInstanceOfType(typeof (Service<string>), manager.GetInstance<IService<string>>()); + container.GetInstance<IService<string>>().ShouldBeOfType<Service<string>>(); - manager.SetDefaultsToProfile("2"); - Assert.IsInstanceOfType(typeof (Service2<int>), manager.GetInstance<IService<int>>()); + container.SetDefaultsToProfile("2"); + + container.GetInstance<IService<string>>().ShouldBeOfType<Service2<string>>(); } [Test] Modified: trunk/Source/StructureMap.Testing/GenericsIntegrationTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/GenericsIntegrationTester.cs 2009-12-24 04:53:19 UTC (rev 285) +++ trunk/Source/StructureMap.Testing/GenericsIntegrationTester.cs 2009-12-26 05:32:08 UTC (rev 286) @@ -7,7 +7,7 @@ namespace StructureMap.Testing { - [TestFixture] + [TestFixture, Ignore("Putting right back on")] public class GenericsIntegrationTester { #region Setup/Teardown Modified: trunk/Source/StructureMap.Testing/Graph/ArrayConstructorTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/ArrayConstructorTester.cs 2009-12-24 04:53:19 UTC (rev 285) +++ trunk/Source/StructureMap.Testing/Graph/ArrayConstructorTester.cs 2009-12-26 05:32:08 UTC (rev 286) @@ -33,5 +33,6 @@ d2.Rules[1].ShouldBeOfType<ColorRule>().Color.ShouldEqual("Blue"); d2.Rules[2].ShouldBeOfType<ColorRule>().Color.ShouldEqual("Purple"); } + } } \ No newline at end of file Deleted: trunk/Source/StructureMap.Testing/Graph/EmittingTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/EmittingTester.cs 2009-12-24 04:53:19 UTC (rev 285) +++ trunk/Source/StructureMap.Testing/Graph/EmittingTester.cs 2009-12-26 05:32:08 UTC (rev 286) @@ -1,168 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using NUnit.Framework; -using StructureMap.Attributes; -using StructureMap.Emitting; -using StructureMap.Emitting.Parameters; -using StructureMap.Graph; -using StructureMap.Pipeline; -using StructureMap.Testing.Pipeline; -using StructureMap.Testing.Widget; - -namespace StructureMap.Testing.Graph -{ - [TestFixture] - public class EmittingTester - { - #region Setup/Teardown - - [SetUp] - public void SetUp() - { - instance = ComplexRule.GetInstance(); - - try - { - var plugin = new Plugin(typeof (ComplexRule)); - - var _InstanceBuilderAssembly = - new InstanceBuilderAssembly(new[] {plugin}); - - List<InstanceBuilder> list = _InstanceBuilderAssembly.Compile(); - builder = list[0]; - - if (builder != null) - { - rule = (ComplexRule) builder.BuildInstance(instance, new StubBuildSession()); - } - } - catch (Exception e) - { - ex = e; - Debug.WriteLine(e.ToString()); - } - } - - #endregion - - private InstanceBuilder builder; - private Exception ex; - private IConfiguredInstance instance; - private ComplexRule rule; - - [Test] - public void BoolProperty() - { - Assert.AreEqual(true, rule.Bool); - } - - [Test] - public void BuiltTheInstanceBuilder() - { - Assert.IsNotNull(builder); - } - - [Test] - public void ByteProperty() - { - Assert.AreEqual(3, rule.Byte); - } - - [Test] - public void can_get_the_parse_method_from_Enum() - { - Methods.ENUM_PARSE.ShouldNotBeNull(); - } - - [Test] - public void DoubleProperty() - { - Assert.AreEqual(4, rule.Double); - } - - [Test] - public void EmitANoArgClass() - { - var plugin = new Plugin(typeof (NoArgClass)); - var _InstanceBuilderAssembly = - new InstanceBuilderAssembly(new[] {plugin}); - List<InstanceBuilder> list = _InstanceBuilderAssembly.Compile(); - builder = list[0]; - - object obj = builder.BuildInstance(new ConfiguredInstance(typeof (NoArgClass)), new StubBuildSession()); - obj.ShouldNotBeNull(); - } - - - [Test] - public void EmitAOneSetterClass() - { - var plugin = new Plugin(typeof (WithOneSetter)); - var _InstanceBuilderAssembly = - new InstanceBuilderAssembly(new[] {plugin}); - List<InstanceBuilder> list = _InstanceBuilderAssembly.Compile(); - builder = list[0]; - - object obj = - builder.BuildInstance( - new ConfiguredInstance(typeof (WithOneSetter)).WithProperty("Name").EqualTo("Jeremy"), - new StubBuildSession()); - obj.ShouldNotBeNull(); - } - - [Test] - public void GotRule() - { - Assert.IsNotNull(rule); - } - - [Test] - public void IntProperty() - { - Assert.AreEqual(1, rule.Int); - } - - [Test] - public void LongProperty() - { - Assert.AreEqual(2, rule.Long); - } - - [Test] - public void NoException() - { - if (ex != null) - { - Console.Out.WriteLine(ex.Message); - Console.Out.WriteLine(ex.Source); - Console.Out.WriteLine(ex.StackTrace); - - Assert.Fail("Had an Exception!!!"); - } - } - - - [Test] - public void String2Property() - { - Assert.AreEqual("Green", rule.String2); - } - - [Test] - public void StringProperty() - { - Assert.AreEqual("Red", rule.String); - } - } - - public class NoArgClass - { - } - - public class WithOneSetter - { - [SetterProperty] - public string Name { get; set; } - } -} \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Graph/GenericsPluginGraphTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/GenericsPluginGraphTester.cs 2009-12-24 04:53:19 UTC (rev 285) +++ trunk/Source/StructureMap.Testing/Graph/GenericsPluginGraphTester.cs 2009-12-26 05:32:08 UTC (rev 286) @@ -61,7 +61,8 @@ family.AddPlugin(typeof (SecondGenericService<>), "Second"); family.AddPlugin(typeof (ThirdGenericService<>), "Third"); - PluginFamily templatedFamily = GenericsPluginGraph.CreateTemplatedClone(family, typeof (int)); + PluginFamily templatedFamily1 = family.CreateTemplatedClone(new[]{typeof (int)}); + PluginFamily templatedFamily = templatedFamily1; Assert.IsNotNull(templatedFamily); Assert.AreEqual(typeof (IGenericService<int>), templatedFamily.PluginType); Modified: trunk/Source/StructureMap.Testing/Graph/SetterInjectionEmittingTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/SetterInjectionEmittingTester.cs 2009-12-24 04:53:19 UTC (rev 285) +++ trunk/Source/StructureMap.Testing/Graph/SetterInjectionEmittingTester.cs 2009-12-26 05:32:08 UTC (rev 286) @@ -1,3 +1,4 @@ +using System.Diagnostics; using NUnit.Framework; using StructureMap.Graph; using StructureMap.Source; @@ -21,7 +22,7 @@ } - private Container buildInstanceManager() + private Container buildContainer() { PluginGraph pluginGraph = DataMother.BuildPluginGraphFromXml( @@ -72,18 +73,16 @@ [Test] public void ChildArraySetter() { - Container manager = buildInstanceManager(); - - var column = - (WidgetArrayGridColumn) manager.GetInstance(typeof (IGridColumn), "WidgetArray"); - - Assert.AreEqual(3, column.Widgets.Length); + var container = buildContainer(); + container.GetInstance<IGridColumn>("WidgetArray") + .ShouldBeOfType<WidgetArrayGridColumn>() + .Widgets.Length.ShouldEqual(3); } [Test] public void ChildObjectSetter() { - Container manager = buildInstanceManager(); + Container manager = buildContainer(); var column = (WidgetGridColumn) manager.GetInstance(typeof (IGridColumn), "BlueWidget"); Modified: trunk/Source/StructureMap.Testing/Graph/SingleImplementationScannerTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/SingleImplementationScannerTester.cs 2009-12-24 04:53:19 UTC (rev 285) +++ trunk/Source/StructureMap.Testing/Graph/SingleImplementationScannerTester.cs 2009-12-26 05:32:08 UTC (rev 286) @@ -9,7 +9,7 @@ [TestFixture] public class SingleImplementationScannerTester { - [Test] + [Test, Ignore("Come back to this")] public void registers_plugins_that_only_have_a_single_implementation() { var container = new Container(registry => Modified: trunk/Source/StructureMap.Testing/Graph/TestExplicitArguments.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/TestExplicitArguments.cs 2009-12-24 04:53:19 UTC (rev 285) +++ trunk/Source/StructureMap.Testing/Graph/TestExplicitArguments.cs 2009-12-26 05:32:08 UTC (rev 286) @@ -148,13 +148,12 @@ [Test] public void ExplicitArguments_can_return_child_by_name() { - var args = new ExplicitArguments(); var theNode = new Node(); - args.SetArg("node", theNode); - - IConfiguredInstance instance = new ExplicitInstance(typeof (Command), args, new SmartInstance<Command>()); - - Assert.AreSame(theNode, instance.Get("node", typeof (Node), new StubBuildSession())); + var container = new Container(x => + { + x.For<IView>().Use<View>(); + }); + container.With("node").EqualTo(theNode).GetInstance<Command>().Node.ShouldBeTheSameAs(theNode); } [Test] Deleted: trunk/Source/StructureMap.Testing/InstanceBuilderListTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/InstanceBuilderListTester.cs 2009-12-24 04:53:19 UTC (rev 285) +++ trunk/Source/StructureMap.Testing/InstanceBuilderListTester.cs 2009-12-26 05:32:08 UTC (rev 286) @@ -1,65 +0,0 @@ -using NUnit.Framework; -using StructureMap.Graph; -using StructureMap.Testing.Widget; - -namespace StructureMap.Testing -{ - [TestFixture] - public class InstanceBuilderListTester - { - [Test] - public void Do_not_add_a_new_InstanceBuilder_for_the_same_plugged_type_but_different_concrete_key() - { - var list = new InstanceBuilderList(typeof (IWidget)); - var plugin = new Plugin(typeof (AWidget)); - list.Add(plugin); - - var plugin2 = new Plugin(typeof (AWidget), "DifferentKey"); - list.Add(plugin2); - - Assert.AreEqual(1, list.BuilderCount); - } - - [Test] - public void Find_the_InstanceBuilder_by_concrete_key_with_different_aliased_concrete_keys() - { - var list = new InstanceBuilderList(typeof (IWidget)); - var plugin = new Plugin(typeof (AWidget)); - list.Add(plugin); - - var plugin2 = new Plugin(typeof (AWidget), "DifferentKey"); - list.Add(plugin2); - - InstanceBuilder builder1 = list.FindByConcreteKey(plugin.ConcreteKey); - InstanceBuilder builder2 = list.FindByConcreteKey(plugin2.ConcreteKey); - - Assert.AreSame(builder1, builder2); - } - - [Test] - public void InstanceBuilderList_add_a_new_InstanceBuilder_if_the_new_Plugin_is_not_recognized() - { - var list = new InstanceBuilderList(typeof (IWidget)); - Assert.AreEqual(0, list.BuilderCount); - - var plugin = new Plugin(typeof (AWidget)); - list.Add(plugin); - - Assert.AreEqual(1, list.BuilderCount); - InstanceBuilder builder = list.FindByType(typeof (AWidget)); - - Assert.IsNotNull(builder); - } - - [Test] - public void InstanceBuilderList_should_not_add_a_new_InstanceBuilder_if_the_same_one_exists() - { - var list = new InstanceBuilderList(typeof (IWidget)); - var plugin = new Plugin(typeof (AWidget)); - list.Add(plugin); - list.Add(plugin); - - Assert.AreEqual(1, list.BuilderCount); - } - } -} \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/InstanceMementoInstanceCreationTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/InstanceMementoInstanceCreationTester.cs 2009-12-24 04:53:19 UTC (rev 285) +++ trunk/Source/StructureMap.Testing/InstanceMementoInstanceCreationTester.cs 2009-12-26 05:32:08 UTC (rev 286) @@ -42,11 +42,11 @@ [DefaultConstructor] - public ComplexRule(string String, BreedEnum Color, int Int, long Long, byte Byte, double Double, bool Bool, + public ComplexRule(string String, BreedEnum Breed, int Int, long Long, byte Byte, double Double, bool Bool, IAutomobile car, IAutomobile[] cars) { _String = String; - _color = Color; + _color = Breed; _Int = Int; _Long = Long; _Byte = Byte; @@ -105,12 +105,12 @@ { var memento = new MemoryInstanceMemento("", "Sample"); memento.SetProperty("String", "Red"); - memento.SetProperty("Color", "Green"); + memento.SetProperty("Breed", "Longhorn"); memento.SetProperty("Int", "1"); memento.SetProperty("Long", "2"); memento.SetProperty("Byte", "3"); memento.SetProperty("Double", "4"); - memento.SetProperty("Bool", "true"); + memento.SetProperty("Bool", "True"); return memento; } @@ -227,8 +227,9 @@ var instance = (IConfiguredInstance) memento.ReadInstance(graph, typeof (Rule)); + Assert.AreEqual(memento.GetProperty("String"), instance.GetProperty("String")); - Assert.AreEqual(memento.GetProperty("Color"), instance.GetProperty("Color")); + Assert.AreEqual(memento.GetProperty("Breed"), instance.GetProperty("Breed")); Assert.AreEqual(memento.GetProperty("Int"), instance.GetProperty("Int")); Assert.AreEqual(memento.GetProperty("Long"), instance.GetProperty("Long")); Assert.AreEqual(memento.GetProperty("Byte"), instance.GetProperty("Byte")); Modified: trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs 2009-12-24 04:53:19 UTC (rev 285) +++ trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs 2009-12-26 05:32:08 UTC (rev 286) @@ -1,7 +1,9 @@ using System; +using System.Collections.Generic; using NUnit.Framework; using Rhino.Mocks; using StructureMap.Configuration.DSL; +using StructureMap.Construction; using StructureMap.Graph; using StructureMap.Pipeline; using StructureMap.Testing.Configuration.DSL; @@ -9,6 +11,7 @@ using StructureMap.Testing.Widget; using StructureMap.Testing.Widget2; using StructureMap.Testing.Widget3; +using StructureMap.TypeRules; namespace StructureMap.Testing.Pipeline { @@ -53,30 +56,7 @@ } } - [Test] - public void Build_happy_path() - { - var mocks = new MockRepository(); - var builder = mocks.StrictMock<InstanceBuilder>(); - var session = mocks.StrictMock<BuildSession>(); - var theObjectBuilt = new object(); - - var instance = new ConfiguredInstance(GetType()); - - using (mocks.Record()) - { - Expect.Call(builder.BuildInstance(instance, session)).Return(theObjectBuilt); - } - - using (mocks.Playback()) - { - object actualObject = ((IConfiguredInstance) instance).Build(GetType(), session, builder); - Assert.AreSame(theObjectBuilt, actualObject); - } - } - - [Test] public void BuildRule1() { var instance = new ConfiguredInstance(typeof (Rule1)); @@ -121,8 +101,7 @@ var instance = new ConfiguredInstance(typeof (ColorRule)); var family = new PluginFamily(typeof (IWidget)); - IDiagnosticInstance diagnosticInstance = instance; - Assert.IsFalse(diagnosticInstance.CanBePartOfPluginFamily(family)); + instance.As<IDiagnosticInstance>().CanBePartOfPluginFamily(family).ShouldBeFalse(); } [Test] @@ -135,21 +114,6 @@ } [Test] - public void Create_description_if_has_plugged_type_and_plugged_type_has_no_arguments() - { - var instance = new ConfiguredInstance(GetType()); - TestUtility.AssertDescriptionIs(instance, GetType().AssemblyQualifiedName); - } - - [Test] - public void Create_description_if_has_pluggedType_and_plugged_type_has_arguments() - { - var instance = new ConfiguredInstance(typeof (ColorService)); - TestUtility.AssertDescriptionIs(instance, - "Configured " + typeof (ColorService).AssemblyQualifiedName); - } - - [Test] public void get_the_concrete_type_from_diagnostic_instance() { var instance = new ConfiguredInstance(typeof (ColorRule)) as IDiagnosticInstance; @@ -161,15 +125,16 @@ public void GetProperty_happy_path() { ConfiguredInstance instance = new ConfiguredInstance(typeof (ColorRule)) - .WithProperty("Color").EqualTo("Red").WithProperty("Age").EqualTo("34"); + .WithProperty("color").EqualTo("Red").WithProperty("Age").EqualTo("34"); IConfiguredInstance configuredInstance = instance; - Assert.AreEqual("Red", configuredInstance.GetProperty("Color")); + + Assert.AreEqual("Red", configuredInstance.GetProperty("color")); Assert.AreEqual("34", configuredInstance.GetProperty("Age")); - instance.WithProperty("Color").EqualTo("Blue"); - Assert.AreEqual("Blue", configuredInstance.GetProperty("Color")); + instance.WithProperty("color").EqualTo("Blue"); + Assert.AreEqual("Blue", configuredInstance.GetProperty("color")); } [Test] @@ -178,23 +143,26 @@ var instance = new ConfiguredInstance(GetType()); IConfiguredInstance configuredInstance = instance; - configuredInstance.HasProperty("prop1").ShouldBeFalse(); + configuredInstance.HasProperty("prop1", null).ShouldBeFalse(); instance.Child("prop1").IsNamedInstance("something"); - configuredInstance.HasProperty("prop1").ShouldBeTrue(); + configuredInstance.HasProperty("prop1", null).ShouldBeTrue(); } + public List<string> prop1 { get; set; } + public IGateway[] gateways { get; set; } + [Test] public void HasProperty_for_child_array() { var instance = new ConfiguredInstance(GetType()); IConfiguredInstance configuredInstance = instance; - configuredInstance.HasProperty("prop1").ShouldBeFalse(); + configuredInstance.HasProperty("prop1", null).ShouldBeFalse(); instance.ChildArray<IGateway[]>("prop1").Contains(new DefaultInstance()); - configuredInstance.HasProperty("prop1").ShouldBeTrue(); + configuredInstance.HasProperty("prop1", null).ShouldBeTrue(); } [Test] @@ -203,10 +171,10 @@ var instance = new ConfiguredInstance(typeof(UsesGateways)); IConfiguredInstance configuredInstance = instance; - configuredInstance.HasProperty("gateways").ShouldBeFalse(); + configuredInstance.HasProperty("gateways", null).ShouldBeFalse(); instance.ChildArray<IGateway[]>().Contains(new DefaultInstance()); - configuredInstance.HasProperty("gateways").ShouldBeTrue(); + configuredInstance.HasProperty("gateways", null).ShouldBeTrue(); } [Test] @@ -215,10 +183,10 @@ var instance = new ConfiguredInstance(typeof(UsesGateways)); IConfiguredInstance configuredInstance = instance; - configuredInstance.HasProperty("gateways").ShouldBeFalse(); + configuredInstance.HasProperty("gateways", null).ShouldBeFalse(); instance.ChildArray(typeof(IGateway[])).Contains(new DefaultInstance()); - configuredInstance.HasProperty("gateways").ShouldBeTrue(); + configuredInstance.HasProperty("gateways", null).ShouldBeTrue(); } public class UsesGateways @@ -236,9 +204,8 @@ { try { - IConfiguredInstance configuredInstance = new ConfiguredInstance(GetType()); - configuredInstance.GetProperty("anything"); - Assert.Fail("Did not throw exception"); + IConfiguredInstance configuredInstance = new ConfiguredInstance(typeof(ClassThatTakesAnything)); + configuredInstance.Get<string>("anything", new StubBuildSession()); } catch (StructureMapException ex) { @@ -246,30 +213,14 @@ } } - [Test] - public void Should_find_the_InstanceBuilder_by_PluggedType_if_it_exists() + public class ClassThatTakesAnything { - var mocks = new MockRepository(); - var session = mocks.DynamicMock<BuildSession>(); - - Type thePluginType = typeof (IGateway); - Type thePluggedType = GetType(); - var builder = mocks.StrictMock<InstanceBuilder>(); - - var instance = new ConfiguredInstance(thePluggedType); - - using (mocks.Record()) + public ClassThatTakesAnything(string anything) { - PluginCache.Store(thePluggedType, builder); - Expect.Call(builder.BuildInstance(instance, session)).Return(new object()); } - - using (mocks.Playback()) - { - instance.Build(thePluginType, session); - } } + [Test] public void TestComplexRule() { @@ -284,14 +235,14 @@ public void Trying_to_build_with_an_InvalidCastException_will_throw_error_206() { var mocks = new MockRepository(); - var builder = mocks.StrictMock<InstanceBuilder>(); - Expect.Call(builder.BuildInstance(null, null)).Throw(new InvalidCastException()); + var builder = mocks.StrictMock<IInstanceBuilder>(); + Expect.Call(builder.BuildInstance(null)).Throw(new InvalidCastException()); LastCall.IgnoreArguments(); mocks.Replay(builder); assertActionThrowsErrorCode(206, delegate { - IConfiguredInstance instance = new ConfiguredInstance(GetType()); + var instance = new ConfiguredInstance(GetType()); instance.Build(GetType(), new StubBuildSession(), builder); }); } @@ -300,14 +251,14 @@ public void Trying_to_build_with_an_unknown_exception_will_throw_error_207() { var mocks = new MockRepository(); - var builder = mocks.StrictMock<InstanceBuilder>(); - Expect.Call(builder.BuildInstance(null, null)).Throw(new Exception()); + var builder = mocks.StrictMock<IInstanceBuilder>(); + Expect.Call(builder.BuildInstance(null)).Throw(new Exception()); LastCall.IgnoreArguments(); mocks.Replay(builder); assertActionThrowsErrorCode(207, delegate { - IConfiguredInstance instance = new ConfiguredInstance(GetType()); + var instance = new ConfiguredInstance(GetType()); instance.Build(GetType(), new StubBuildSession(), builder); }); } Modified: trunk/Source/StructureMap.Testing/Pipeline/DefaultInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/DefaultInstanceTester.cs 2009-12-24 04:53:19 UTC (rev 285) +++ trunk/Source/StructureMap.Testing/Pipeline/DefaultInstanceTester.cs 2009-12-26 05:32:08 UTC (rev 286) @@ -1,6 +1,8 @@ +using System.Collections.Generic; using NUnit.Framework; using Rhino.Mocks; using StructureMap.Pipeline; +using StructureMap.Testing.Widget; namespace StructureMap.Testing.Pipeline { @@ -51,5 +53,37 @@ { TestUtility.AssertDescriptionIs(new DefaultInstance(), "Default"); } + + [Test] + public void use_all_instances_of_an_enumerable_element_type() + { + var widget1 = new AWidget(); + var widget2 = new AWidget(); + var widget3 = new AWidget(); + + var container = new Container(x => + { + x.For<IWidget>().AddInstances(o => + { + o.Object(widget1); + o.Object(widget2); + o.Object(widget3); + }); + }); + + container.GetInstance<ClassWithWidgets>().Widgets.ShouldHaveTheSameElementsAs(widget1, widget2, widget3); + } + + public class ClassWithWidgets + { + private readonly List<IWidget> _widgets; + + public ClassWithWidgets(List<IWidget> widgets) + { + _widgets = widgets; + } + + public List<IWidget> Widgets { get { return _widgets; } } + } } } \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Pipeline/EnumerableInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/EnumerableInstanceTester.cs 2009-12-24 04:53:19 UTC (rev 285) +++ trunk/Source/StructureMap.Testing/Pipeline/EnumerableInstanceTester.cs 2009-12-26 05:32:08 UTC (rev 286) @@ -14,6 +14,16 @@ } [Test] + public void is_enumerable() + { + EnumerableInstance.IsEnumerable(typeof (IWidget[])).ShouldBeTrue(); + EnumerableInstance.IsEnumerable(typeof (IList<IWidget>)).ShouldBeTrue(); + EnumerableInstance.IsEnumerable(typeof (IEnumerable<IWidget>)).ShouldBeTrue(); + EnumerableInstance.IsEnumerable(typeof (List<IWidget>)).ShouldBeTrue(); + EnumerableInstance.IsEnumerable(typeof (IWidget)).ShouldBeFalse(); + } + + [Test] public void build_coercion_strategy_for_an_array() { EnumerableInstance.DetermineCoercion(typeof (IWidget[])).ShouldBeOfType<ArrayCoercion<IWidget>>(); Modified: trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs 2009-12-24 04:53:19 UTC (rev 285) +++ trunk/Source/StructureMap.Testing/Pipeline/OptionalSetterInjectionTester.cs 2009-12-26 05:32:08 UTC (rev 286) @@ -8,23 +8,8 @@ namespace StructureMap.Testing.Pipeline { - public class ClassWithOneSetterBuilder : InstanceBuilder - { - public override Type PluggedType - { - get { throw new NotImplementedException(); } - } - public override object BuildInstance(IConfiguredInstance instance, BuildSession session) - { - var target = new ClassWithOneSetter(); - if (instance.HasProperty("Name")) target.Name = instance.GetProperty("Name"); - return target; - } - } - - [TestFixture] public class OptionalSetterInjectionTester { @@ -333,23 +318,6 @@ public ColorEnum Color { get; set; } } - public class ClassWithOneEnumBuilder : InstanceBuilder - { - public override Type PluggedType - { - get { throw new NotImplementedException(); } - } - - public override object BuildInstance(IConfiguredInstance instance, BuildSession session) - { - var target = new ClassWithOneEnum(); - if (instance.HasProperty("Color")) - target.Color = (ColorEnum) Enum.Parse(typeof (ColorEnum), instance.GetProperty("Color")); - - return target; - } - } - public class ClassWithOneLongAndOneBool { public bool Active { get; set; } Modified: trunk/Source/StructureMap.Testing/Pipeline/SmartInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/SmartInstanceTester.cs 2009-12-24 04:53:19 UTC (rev 285) +++ trunk/Source/StructureMap.Testing/Pipeline/SmartInstanceTester.cs 2009-12-26 05:32:08 UTC (rev 286) @@ -14,6 +14,7 @@ private SmartInstance<T> instanceOf<T>() { var instance = new SmartInstance<T>(); + structuredInstance = instance; configuredInstance = instance; Modified: trunk/Source/StructureMap.Testing/Pipeline/StubBuildSession.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/StubBuildSession.cs 2009-12-24 04:53:19 UTC (rev 285) +++ trunk/Source/StructureMap.Testing/Pipeline/StubBuildSession.cs 2009-12-26 05:32:08 UTC (rev 286) @@ -1,4 +1,5 @@ using System; +using StructureMap.Construction; using StructureMap.Graph; using StructureMap.Pipeline; using StructureMap.Testing.Widget; @@ -21,17 +22,7 @@ } } - public InstanceBuilder FindBuilderByType(Type pluginType, Type pluggedType) - { - if (pluggedType == null) - { - return null; - } - var list = new InstanceBuilderList(pluginType, new[] {new Plugin(pluggedType),}); - return list.FindByType(pluggedType); - } - public InstanceBuilder FindBuilderByConcreteKey(Type pluginType, string concreteKey) { throw new NotImplementedException(); Modified: trunk/Source/StructureMap.Testing/SpecificationExtensions.cs =================================================================== --- trunk/Source/StructureMap.Testing/SpecificationExtensions.cs 2009-12-24 04:53:19 UTC (rev 285) +++ trunk/Source/StructureMap.Testing/SpecificationExtensions.cs 2009-12-26 05:32:08 UTC (rev 286) @@ -1,5 +1,6 @@ using System; using System.Collections; +using System.Linq; using NUnit.Framework; namespace StructureMap.Testing @@ -8,6 +9,35 @@ public static class SpecificationExtensions { + public static void ShouldHaveTheSameElementsAs<T>(this System.Collections.Generic.IEnumerable<T> actual, System.Collections.Generic.IEnumerable<T> expected) + { + IList actualList = (actual is IList) ? (IList)actual : actual.ToList(); + IList expectedList = (expected is IList) ? (IList)expected : expected.ToList(); + + ShouldHaveTheSameElementsAs(actualList, expectedList); + } + + public static void ShouldHaveTheSameElementsAs<T>(this System.Collections.Generic.IEnumerable<T> actual, params T[] expected) + { + IList actualList = (actual is IList) ? (IList)actual : actual.ToList(); + IList expectedList = (expected is IList) ? (IList)expected : expected.ToList(); + + ShouldHaveTheSameElementsAs(actualList, expectedList); + } + + public static void ShouldHaveTheSameElementsAs(this IList actual, IList expected) + { + actual.ShouldNotBeNull(); + expected.ShouldNotBeNull(); + + actual.Count.ShouldEqual(expected.Count); + + for (int i = 0; i < actual.Count; i++) + { + actual[i].ShouldEqual(expected[i]); + } + } + public static void ShouldBeFalse(this bool condition) { Assert.IsFalse(condition); Modified: trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj =================================================================== --- trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-12-24 04:53:19 UTC (rev 285) +++ trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-12-26 05:32:08 UTC (rev 286) @@ -227,6 +227,10 @@ <Compile Include="Configuration\PrimitiveArrayReaderTester.cs" /> <Compile Include="Configuration\ProfileBuilderTester.cs" /> <Compile Include="Configuration\ShortcuttedInstanceNodeTester.cs" /> + <Compile Include="Construction\BuilderCompilerTester.cs" /> + <Compile Include="Construction\ConstructorFunctionBuilderTester.cs" /> + <Compile Include="Construction\SetterBuilderTester.cs" /> + <Compile Include="Construction\StubArguments.cs" /> <Compile Include="Debugging.cs" /> <Compile Include="Diagnostics\DoctorTester.cs" /> <Compile Include="Diagnostics\WriterExtensions.cs" /> @@ -247,9 +251,6 @@ <Compile Include="Graph\ConventionBasedSetterInjectionTester.cs" /> <Compile Include="Graph\DefaultConventionScanningTester.cs" /> <Compile Include="Graph\DynamicInjectionTester.cs" /> - <Compile Include="Graph\EmittingTester.cs"> - <SubType>Code</SubType> - </Compile> <Compile Include="Graph\EnumerationTester.cs"> <SubType>Code</SubType> </Compile> @@ -340,7 +341,6 @@ </Compile> <Compile Include="Graph\TypePathTester.cs" /> <Compile Include="ImplicitPluginFromPluggedTypeAttributeTester.cs" /> - <Compile Include="InstanceBuilderListTester.cs" /> <Compile Include="InstanceCacheTester.cs" /> <Compile Include="InstanceMementoInstanceCreationTester.cs" /> <Compile Include="MementoTester.cs" /> Modified: trunk/Source/StructureMap.Testing/StructureMapConfigurationTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/StructureMapConfigurationTester.cs 2009-12-24 04:53:19 UTC (rev 285) +++ trunk/Source/StructureMap.Testing/StructureMapConfigurationTester.cs 2009-12-26 05:32:08 UTC (rev 286) @@ -77,8 +77,12 @@ [Test] public void PullConfigurationFromTheAppConfig() { - StructureMapConfiguration.UseDefaultStructureMapConfigFile = false; - StructureMapConfiguration.PullConfigurationFromAppConfig = true; + + ObjectFactory.Initialize(x => + { + x.UseDefaultStructureMapConfigFile = false; + x.PullConfigurationFromAppConfig = true; + }); ObjectFactory.GetInstance<IThing<string, bool>>() .IsType<ColorThing<string, bool>>().Color.ShouldEqual("Cornflower"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-12-24 04:53:31
|
Revision: 285 http://structuremap.svn.sourceforge.net/structuremap/?rev=285&view=rev Author: jeremydmiller Date: 2009-12-24 04:53:19 +0000 (Thu, 24 Dec 2009) Log Message: ----------- Work on the new ConstructorInstance, EnumerableInstance Modified Paths: -------------- trunk/Source/StructureMap/BuildSession.cs trunk/Source/StructureMap/CloseGenericTypeExpression.cs trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs trunk/Source/StructureMap/Configuration/DSL/Expressions/ProfileExpression.cs trunk/Source/StructureMap/Configuration/DSL/Registry.cs trunk/Source/StructureMap/Container.cs trunk/Source/StructureMap/Emitting/Parameters/Methods.cs trunk/Source/StructureMap/Graph/Constructor.cs trunk/Source/StructureMap/Graph/ITypeScanner.cs trunk/Source/StructureMap/Graph/Plugin.cs trunk/Source/StructureMap/Graph/SetterPropertyCollection.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs trunk/Source/StructureMap/Pipeline/IConfiguredInstance.cs trunk/Source/StructureMap/Pipeline/InstanceMementoPropertyReader.cs trunk/Source/StructureMap/Pipeline/PropertyExpression.cs trunk/Source/StructureMap/Pipeline/SmartInstance.cs trunk/Source/StructureMap/PipelineGraph.cs trunk/Source/StructureMap/StructureMap.csproj trunk/Source/StructureMap/TypeExtensions.cs trunk/Source/StructureMap.AutoMocking/AutoMockedContainer.cs trunk/Source/StructureMap.Testing/BuildSessionTester.cs trunk/Source/StructureMap.Testing/Configuration/DSL/ProfileExpressionTester.cs trunk/Source/StructureMap.Testing/Diagnostics/ValidationBuildSessionTester.cs trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs trunk/Source/StructureMap.Testing/Graph/InstanceFactoryTester.cs trunk/Source/StructureMap.Testing/Graph/PluginFamilyMergeTester.cs trunk/Source/StructureMap.Testing/Graph/PluginTester.cs trunk/Source/StructureMap.Testing/Graph/TestExplicitArguments.cs trunk/Source/StructureMap.Testing/Pipeline/MissingInstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/ProfileManagerMergeTester.cs trunk/Source/StructureMap.Testing/Pipeline/ProfileManagerTester.cs trunk/Source/StructureMap.Testing/Pipeline/ProfileTester.cs trunk/Source/StructureMap.Testing/Pipeline/ReferencedInstanceTester.cs trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj trunk/Source/StructureMap.Testing.Widget/Hierarchy.cs Added Paths: ----------- trunk/Source/StructureMap/Pipeline/ArrayCoercion.cs trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs trunk/Source/StructureMap/Pipeline/EnumerableInstance.cs trunk/Source/StructureMap/Pipeline/IEnumerableCoercion.cs trunk/Source/StructureMap/Pipeline/LambdaInstance.cs trunk/Source/StructureMap/Pipeline/ListCoercion.cs trunk/Source/StructureMap/Pipeline/ObjectInstance.cs trunk/Source/StructureMap.Testing/Pipeline/ConstructorInstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/EnumerableInstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/LambdaInstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/ObjectInstanceTester.cs Removed Paths: ------------- trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs trunk/Source/StructureMap/Pipeline/HttpSessionBuildPolicy.cs trunk/Source/StructureMap/Pipeline/Lifecycle.cs trunk/Source/StructureMap/Pipeline/LiteralInstance.cs trunk/Source/StructureMap.Testing/Pipeline/ConstructorInstanceTester.cs trunk/Source/StructureMap.Testing/Pipeline/LiteralInstanceTester.cs Modified: trunk/Source/StructureMap/BuildSession.cs =================================================================== --- trunk/Source/StructureMap/BuildSession.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap/BuildSession.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -153,7 +153,7 @@ return result; } - + [Obsolete("Move all of this into the new EnumerableInstance")] public virtual Array CreateInstanceArray(Type pluginType, Instance[] instances) { if (instances == null) Modified: trunk/Source/StructureMap/CloseGenericTypeExpression.cs =================================================================== --- trunk/Source/StructureMap/CloseGenericTypeExpression.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap/CloseGenericTypeExpression.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -40,7 +40,7 @@ private void closeType(Type type) { - if (!type.IsGeneric()) + if (!type.IsOpenGeneric()) { throw new StructureMapException(285); } Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -124,7 +124,7 @@ /// </summary> /// <param name="func"></param> /// <returns></returns> - public ConstructorInstance<PLUGINTYPE> Use(Func<IContext, PLUGINTYPE> func) + public LambdaInstance<PLUGINTYPE> Use(Func<IContext, PLUGINTYPE> func) { return TheDefault.Is.ConstructedBy(func); } @@ -134,7 +134,7 @@ /// </summary> /// <param name="object"></param> /// <returns></returns> - public LiteralInstance Use(PLUGINTYPE @object) + public ObjectInstance Use(PLUGINTYPE @object) { return TheDefault.IsThis(@object); } Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -72,9 +72,9 @@ /// </summary> /// <param name="value"></param> /// <returns></returns> - public LiteralInstance Use(object value) + public ObjectInstance Use(object value) { - var instance = new LiteralInstance(value); + var instance = new ObjectInstance(value); Use(instance); return instance; @@ -105,7 +105,7 @@ public GenericFamilyExpression Add(object instance) { - return Add(new LiteralInstance(instance)); + return Add(new ObjectInstance(instance)); } Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -26,7 +26,7 @@ /// </summary> /// <param name="obj"></param> /// <returns></returns> - LiteralInstance IsThis(T obj); + ObjectInstance IsThis(T obj); } public interface ThenItExpression<T> @@ -95,7 +95,7 @@ /// </summary> /// <param name="theObject"></param> /// <returns></returns> - LiteralInstance Object(T theObject); + ObjectInstance Object(T theObject); /// <summary> /// Build the Instance with the constructor function and setter arguments. Starts @@ -123,7 +123,7 @@ /// <param name="func"></param> /// <returns></returns> [Obsolete("Prefer For<T>().Use(Func<T> func) or For<T>().Add(Func<T> func)")] - ConstructorInstance<T> ConstructedBy(Func<T> func); + LambdaInstance<T> ConstructedBy(Func<T> func); /// <summary> /// Create an Instance that builds an object by calling a Lambda or @@ -132,7 +132,7 @@ /// </summary> /// <param name="func"></param> /// <returns></returns> - ConstructorInstance<T> ConstructedBy(Func<IContext, T> func); + LambdaInstance<T> ConstructedBy(Func<IContext, T> func); /// <summary> /// Use the Instance of this PluginType with the specified name. This is @@ -204,9 +204,9 @@ returnInstance(instance); } - public LiteralInstance IsThis(T obj) + public ObjectInstance IsThis(T obj) { - return returnInstance(new LiteralInstance(obj)); + return returnInstance(new ObjectInstance(obj)); } #endregion @@ -232,9 +232,9 @@ return returnInstance(new ConfiguredInstance(type)); } - public LiteralInstance Object(T theObject) + public ObjectInstance Object(T theObject) { - return returnInstance(new LiteralInstance(theObject)); + return returnInstance(new ObjectInstance(theObject)); } public ReferencedInstance TheInstanceNamed(string name) @@ -247,14 +247,14 @@ return returnInstance(new DefaultInstance()); } - public ConstructorInstance<T> ConstructedBy(Func<T> func) + public LambdaInstance<T> ConstructedBy(Func<T> func) { - return returnInstance(new ConstructorInstance<T>(func)); + return returnInstance(new LambdaInstance<T>(func)); } - public ConstructorInstance<T> ConstructedBy(Func<IContext, T> func) + public LambdaInstance<T> ConstructedBy(Func<IContext, T> func) { - return returnInstance(new ConstructorInstance<T>(func)); + return returnInstance(new LambdaInstance<T>(func)); } public PrototypeInstance PrototypeOf(T template) Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/ProfileExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/ProfileExpression.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/ProfileExpression.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -169,7 +169,7 @@ /// <returns></returns> public ProfileExpression Use(Func<T> func) { - var instance = new ConstructorInstance<T>(func); + var instance = new LambdaInstance<T>(func); return Use(instance); } @@ -180,7 +180,7 @@ /// <returns></returns> public ProfileExpression Use(T t) { - var instance = new LiteralInstance(t); + var instance = new ObjectInstance(t); return Use(instance); } Modified: trunk/Source/StructureMap/Configuration/DSL/Registry.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -395,7 +395,7 @@ /// <typeparam name="T"></typeparam> /// <typeparam name="U"></typeparam> /// <returns></returns> - public ConstructorInstance<T> Redirect<T, U>() where T : class where U : class + public LambdaInstance<T> Redirect<T, U>() where T : class where U : class { return For<T>().TheDefault.Is.ConstructedBy(c => { Modified: trunk/Source/StructureMap/Container.cs =================================================================== --- trunk/Source/StructureMap/Container.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap/Container.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -561,7 +561,7 @@ public OpenGenericTypeExpression(Type templateType, Container container) { - if (!templateType.IsGeneric()) + if (!templateType.IsOpenGeneric()) { throw new StructureMapException(285); } @@ -599,7 +599,7 @@ /// <param name="object"></param> public void Inject<T>(string name, T @object) { - LiteralInstance instance = new LiteralInstance(@object).WithName(name); + ObjectInstance instance = new ObjectInstance(@object).WithName(name); _transientCache.Set(typeof(T), instance, @object); _pipelineGraph.AddInstance<T>(instance); } @@ -630,7 +630,7 @@ } - var instance = new LiteralInstance(@object); + var instance = new ObjectInstance(@object); _transientCache.Set(pluginType, instance, @object); _pipelineGraph.SetDefault(pluginType, instance); } Modified: trunk/Source/StructureMap/Emitting/Parameters/Methods.cs =================================================================== --- trunk/Source/StructureMap/Emitting/Parameters/Methods.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap/Emitting/Parameters/Methods.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -24,7 +24,7 @@ }, null); public static MethodInfo GET_CHILD = - ReflectionHelper.GetMethod<IConfiguredInstance>(i => i.GetChild(null, null, null)); + ReflectionHelper.GetMethod<IConfiguredInstance>(i => i.Get(null, null, null)); public static MethodInfo GET_CHILDREN_ARRAY = ReflectionHelper.GetMethod<IConfiguredInstance>(i => i.GetChildrenArray(null)); Modified: trunk/Source/StructureMap/Graph/Constructor.cs =================================================================== --- trunk/Source/StructureMap/Graph/Constructor.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap/Graph/Constructor.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.Linq.Expressions; using System.Reflection; using StructureMap.TypeRules; @@ -81,15 +82,9 @@ public string FindFirstConstructorArgumentOfType(Type type) { - foreach (ParameterInfo info in _ctor.GetParameters()) - { - if (info.ParameterType.Equals(type)) - { - return info.Name; - } - } - - return null; + return _ctor.GetParameters() + .Where(x => x.ParameterType == type) + .Select(x => x.Name).FirstOrDefault(); } @@ -157,5 +152,12 @@ _ctor = ctor; } + + public Type FindArgumentType(string name) + { + return _ctor.GetParameters() + .Where(x => x.Name == name) + .Select(x => x.ParameterType).FirstOrDefault(); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Graph/ITypeScanner.cs =================================================================== --- trunk/Source/StructureMap/Graph/ITypeScanner.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap/Graph/ITypeScanner.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -41,7 +41,7 @@ { _openType = openType; - if (!_openType.IsGeneric()) + if (!_openType.IsOpenGeneric()) { throw new ApplicationException("This scanning convention can only be used with open generic types"); } Modified: trunk/Source/StructureMap/Graph/Plugin.cs =================================================================== --- trunk/Source/StructureMap/Graph/Plugin.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap/Graph/Plugin.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -169,7 +169,12 @@ public bool IsNotOpenGeneric() { - return !_pluggedType.IsGeneric(); + return !_pluggedType.IsOpenGeneric(); } + + public Type FindArgumentType(string argumentName) + { + return _constructor.FindArgumentType(argumentName) ?? _setters.FindArgumentType(argumentName); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Graph/SetterPropertyCollection.cs =================================================================== --- trunk/Source/StructureMap/Graph/SetterPropertyCollection.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap/Graph/SetterPropertyCollection.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -2,6 +2,7 @@ using System.Collections; using System.Collections.Generic; using System.Reflection; +using System.Linq; namespace StructureMap.Graph { @@ -129,5 +130,12 @@ { _properties.FindAll(setter => rule(setter.Property)).ForEach(setter => setter.IsMandatory = true); } + + public Type FindArgumentType(string name) + { + return _properties + .Where(x => x.Name == name) + .Select(x => x.Property.PropertyType).FirstOrDefault(); + } } } \ No newline at end of file Added: trunk/Source/StructureMap/Pipeline/ArrayCoercion.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ArrayCoercion.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/ArrayCoercion.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -0,0 +1,13 @@ +using System.Collections.Generic; +using System.Linq; + +namespace StructureMap.Pipeline +{ + public class ArrayCoercion<T> : IEnumerableCoercion where T : class + { + public object Convert(IEnumerable<object> enumerable) + { + return enumerable.Select(x => x as T).ToArray(); + } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -322,7 +322,7 @@ public ConfiguredInstance Is(object value) { - var instance = new LiteralInstance(value); + var instance = new ObjectInstance(value); return Is(instance); } Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -87,7 +87,7 @@ return _properties[propertyName]; } - object IConfiguredInstance.GetChild(string propertyName, Type pluginType, BuildSession buildSession) + object IConfiguredInstance.Get(string propertyName, Type pluginType, BuildSession buildSession) { return getChild(propertyName, pluginType, buildSession); } @@ -130,7 +130,7 @@ setProperty(propertyName, propertyValue); } - void IConfiguredInstance.SetChild(string name, Instance instance) + void IConfiguredInstance.Set(string name, Instance instance) { setChild(name, instance); } Deleted: trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -1,41 +0,0 @@ -using System; - -namespace StructureMap.Pipeline -{ - public class ConstructorInstance<T> : ExpressedInstance<ConstructorInstance<T>> - { - private readonly Func<IContext, T> _builder; - - public ConstructorInstance(Func<IContext, T> builder) - { - _builder = builder; - } - - public ConstructorInstance(Func<T> func) - { - _builder = s => func(); - } - - protected override ConstructorInstance<T> thisInstance - { - get { return this; } - } - - protected override object build(Type pluginType, BuildSession session) - { - try - { - return _builder(session); - } - catch (Exception ex) - { - throw new StructureMapException(207, ex, Name, pluginType); - } - } - - protected override string getDescription() - { - return "Instance is created by Func<object> function: " + _builder; - } - } -} \ No newline at end of file Added: trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using StructureMap.Graph; +using StructureMap.TypeRules; +using StructureMap.Util; + +namespace StructureMap.Pipeline +{ + public class ConstructorInstance : Instance + { + private readonly Cache<string, Instance> _dependencies = new Cache<string, Instance>(); + private readonly Plugin _plugin; + + public ConstructorInstance(Type pluggedType) + { + _plugin = PluginCache.GetPlugin(pluggedType); + } + + protected override string getDescription() + { + return "Configured Instance of " + _plugin.PluggedType.AssemblyQualifiedName; + } + + public void SetChild(string name, Instance instance) + { + _dependencies[name] = instance; + } + + public void SetValue(string name, object value) + { + var dependencyType = _plugin.FindArgumentType(name); + var instance = buildInstanceForType(dependencyType, value); + _dependencies[name] = instance; + } + + public void SetCollection(string name, IEnumerable<Instance> children) + { + var dependencyType = _plugin.FindArgumentType(name); + var instance = new EnumerableInstance(dependencyType, children); + _dependencies[name] = instance; + } + + private static Instance buildInstanceForType(Type dependencyType, object value) + { + if (value == null) return new NullInstance(); + + + if (dependencyType.IsSimple() || dependencyType.IsNullable() || dependencyType == typeof(Guid) || dependencyType == typeof(DateTime)) + { + var converter = TypeDescriptor.GetConverter(dependencyType); + var convertedValue = converter.ConvertFrom(value); + return new ObjectInstance(convertedValue); + } + + + return new ObjectInstance(value); + } + + public object Get(string propertyName, Type pluginType, BuildSession session) + { + return _dependencies[propertyName].Build(pluginType, session); + } + + protected override object build(Type pluginType, BuildSession session) + { + throw new NotImplementedException(); + } + + public object Build(Type pluginType, BuildSession session, InstanceBuilder builder) + { + throw new NotImplementedException(); + } + + public static ConstructorInstance For<T>() + { + return new ConstructorInstance(typeof(T)); + } + } +} \ No newline at end of file Added: trunk/Source/StructureMap/Pipeline/EnumerableInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/EnumerableInstance.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/EnumerableInstance.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace StructureMap.Pipeline +{ + public class EnumerableInstance : Instance + { + private readonly IEnumerable<Instance> _children; + private readonly IEnumerableCoercion _coercion; + private readonly string _description; + + public EnumerableInstance(Type propertyType, IEnumerable<Instance> children) + { + _description = propertyType.FullName; + + _children = children; + _coercion = DetermineCoercion(propertyType); + } + + public static IEnumerableCoercion DetermineCoercion(Type propertyType) + { + var coercionType = determineCoercionType(propertyType); + return (IEnumerableCoercion) Activator.CreateInstance(coercionType); + } + + private static readonly List<Type> _enumerableTypes = new List<Type>(){typeof(IEnumerable<>), typeof(IList<>), typeof(List<>)}; + private static Type determineCoercionType(Type propertyType) + { + if (propertyType.IsArray) + { + return typeof (ArrayCoercion<>).MakeGenericType(propertyType.GetElementType()); + } + + if (propertyType.IsGenericType ) + { + var templateType = propertyType.GetGenericTypeDefinition(); + if (_enumerableTypes.Contains(templateType)) + { + return typeof (ListCoercion<>).MakeGenericType(propertyType.GetGenericArguments().First()); + } + } + + throw new ArgumentException("Only IEnumerable<T> types can be passed to this constructor. {0} is invalid".ToFormat(propertyType.AssemblyQualifiedName)); + } + + protected override string getDescription() + { + return _description; + } + + protected override object build(Type pluginType, BuildSession session) + { + var objects = _children.Select(x => x.Build(pluginType, session)); + return _coercion.Convert(objects); + } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap/Pipeline/ExplicitArguments.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -54,7 +54,7 @@ if (arg.Value == null) continue; instance.SetProperty(arg.Key, arg.Value.ToString()); - instance.SetChild(arg.Key, new LiteralInstance(arg.Value)); + instance.Set(arg.Key, new ObjectInstance(arg.Value)); } } Deleted: trunk/Source/StructureMap/Pipeline/HttpSessionBuildPolicy.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/HttpSessionBuildPolicy.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap/Pipeline/HttpSessionBuildPolicy.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -1,47 +0,0 @@ -using System; -using System.Collections; -using System.Web; -using StructureMap.Attributes; - -namespace StructureMap.Pipeline -{ - public class HttpSessionBuildPolicy : HttpContextBuildPolicy - { - protected override IDictionary findHttpDictionary() - { - return new SessionWrapper(HttpContext.Current.Session); - } - - public override string ToString() - { - return InstanceScope.HttpSession.ToString(); - } - } - - - public class HttpSessionLifecycle : HttpContextLifecycle - { - protected override IDictionary findHttpDictionary() - { - return new SessionWrapper(HttpContext.Current.Session); - } - } - - public class HybridSessionLifecycle : HttpLifecycleBase<HttpSessionLifecycle, ThreadLocalStorageLifecycle> - { - - } - - public class HybridSessionBuildPolicy : HttpBuildPolicyBase<HttpSessionBuildPolicy, ThreadLocalStoragePolicy> - { - public override IBuildPolicy Clone() - { - return new HybridSessionBuildPolicy() { InnerPolicy = InnerPolicy.Clone() }; - } - - public override string ToString() - { - return InstanceScope.HybridHttpSession.ToString(); - } - } -} \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/IConfiguredInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/IConfiguredInstance.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap/Pipeline/IConfiguredInstance.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -6,13 +6,29 @@ { string Name { get; } Type PluggedType { get; } + + + + [Obsolete] Instance[] GetChildrenArray(string propertyName); + + [Obsolete] string GetProperty(string propertyName); - object GetChild(string propertyName, Type pluginType, BuildSession buildSession); + + + object Get(string propertyName, Type pluginType, BuildSession buildSession); + object Build(Type pluginType, BuildSession session, InstanceBuilder builder); + bool HasProperty(string propertyName); + + [Obsolete] void SetProperty(string name, string value); - void SetChild(string name, Instance instance); + + + void Set(string name, Instance instance); + + [Obsolete] void SetChildArray(string name, Type type, Instance[] children); } } \ No newline at end of file Added: trunk/Source/StructureMap/Pipeline/IEnumerableCoercion.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/IEnumerableCoercion.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/IEnumerableCoercion.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace StructureMap.Pipeline +{ + public interface IEnumerableCoercion + { + object Convert(IEnumerable<object> enumerable); + } +} \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/InstanceMementoPropertyReader.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/InstanceMementoPropertyReader.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap/Pipeline/InstanceMementoPropertyReader.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -90,7 +90,7 @@ { Instance childInstance = _memento.ReadChildInstance(name, _pluginGraph, childType); - _instance.SetChild(name, childInstance); + _instance.Set(name, childInstance); } private void copyChildArray(string name, Type childType) Copied: trunk/Source/StructureMap/Pipeline/LambdaInstance.cs (from rev 282, trunk/Source/StructureMap/Pipeline/ConstructorInstance.cs) =================================================================== --- trunk/Source/StructureMap/Pipeline/LambdaInstance.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/LambdaInstance.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -0,0 +1,41 @@ +using System; + +namespace StructureMap.Pipeline +{ + public class LambdaInstance<T> : ExpressedInstance<LambdaInstance<T>> + { + private readonly Func<IContext, T> _builder; + + public LambdaInstance(Func<IContext, T> builder) + { + _builder = builder; + } + + public LambdaInstance(Func<T> func) + { + _builder = s => func(); + } + + protected override LambdaInstance<T> thisInstance + { + get { return this; } + } + + protected override object build(Type pluginType, BuildSession session) + { + try + { + return _builder(session); + } + catch (Exception ex) + { + throw new StructureMapException(207, ex, Name, pluginType); + } + } + + protected override string getDescription() + { + return "Instance is created by Func<object> function: " + _builder; + } + } +} \ No newline at end of file Deleted: trunk/Source/StructureMap/Pipeline/Lifecycle.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/Lifecycle.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap/Pipeline/Lifecycle.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -1,201 +0,0 @@ -using System; -using System.Collections.Generic; -using StructureMap.Attributes; -using StructureMap.Interceptors; -using StructureMap.Util; - -namespace StructureMap.Pipeline -{ - public interface IObjectCache - { - object Locker { get; } - - int Count - { - get; - } - - object Get(Type pluginType, Instance instance); - void Set(Type pluginType, Instance instance, object value); - void DisposeAndClear(); - } - - public class NulloObjectCache : IObjectCache - { - public object Locker - { - get { return new object(); } - } - - public int Count - { - get { return 0; } - } - - public object Get(Type pluginType, Instance instance) - { - return null; - } - - public void Set(Type pluginType, Instance instance, object value) - { - // no-op - } - - public void DisposeAndClear() - { - // no-op - } - } - - public class MainObjectCache : IObjectCache - { - private readonly IDictionary<InstanceKey, object> _objects = new Dictionary<InstanceKey,object>(); - private readonly object _locker = new object(); - - public object Locker - { - get { return _locker; } - } - - public int Count - { - get { return _objects.Count; } - } - - public object Get(Type pluginType, Instance instance) - { - var key = new InstanceKey(instance, pluginType); - return _objects.ContainsKey(key) ? _objects[key] : null; - } - - public void Set(Type pluginType, Instance instance, object value) - { - var key = new InstanceKey(instance, pluginType); - _objects.Add(key, value); - } - - public void DisposeAndClear() - { - - lock (Locker) - { - foreach (var @object in _objects.Values) - { - IDisposable disposable = @object as IDisposable; - if (disposable != null) - { - try - { - disposable.Dispose(); - } - catch (Exception) { } - } - } - - _objects.Clear(); - } - } - } - - - public interface ILifecycle - { - void EjectAll(); - IObjectCache FindCache(); - } - - public static class Lifecycles - { - public static ILifecycle GetLifecycle(InstanceScope scope) - { - switch (scope) - { - case InstanceScope.PerRequest: - return null; - - case InstanceScope.Singleton: - return new SingletonLifecycle(); - - case InstanceScope.HttpContext: - return new HttpContextLifecycle(); - - case InstanceScope.ThreadLocal: - return new ThreadLocalStorageLifecycle(); - - case InstanceScope.Hybrid: - return new HybridLifecycle(); - - case InstanceScope.HttpSession: - return new HttpSessionLifecycle(); - - case InstanceScope.HybridHttpSession: - return new HybridSessionLifecycle(); - } - - throw new ArgumentOutOfRangeException("scope"); - } - } - - public class ObjectBuilder - { - private readonly PipelineGraph _pipeline; - private readonly InterceptorLibrary _library; - private readonly IObjectCache _defaultCache; - - public ObjectBuilder(PipelineGraph pipeline, InterceptorLibrary library, IObjectCache defaultCache) - { - _pipeline = pipeline; - _library = library; - _defaultCache = defaultCache; - } - - public object Resolve(Type pluginType, Instance instance, BuildSession session) - { - var cache = FindCache(pluginType, instance, session); - lock (cache.Locker) - { - var returnValue = cache.Get(pluginType, instance); - if (returnValue == null) - { - returnValue = ConstructNew(pluginType, instance, session); - - - cache.Set(pluginType, instance, returnValue); - } - - return returnValue; - } - } - - public object ConstructNew(Type pluginType, Instance instance, BuildSession session) - { - object returnValue = instance.Build(pluginType, session); - return ApplyInterception(pluginType, returnValue, session, instance); - } - - public virtual object ApplyInterception(Type pluginType, object actualValue, BuildSession session, Instance instance) - { - if (actualValue == null) return null; - - try - { - return _library.FindInterceptor(actualValue.GetType()).Process(actualValue, session); - } - catch (Exception e) - { - throw new StructureMapException(308, e, instance.Name, actualValue.GetType()); - } - - - } - - public IObjectCache FindCache(Type pluginType, Instance instance, BuildSession session) - { - var lifecycle = _pipeline.ForType(pluginType).Lifecycle; - return lifecycle == null - ? _defaultCache - : lifecycle.FindCache(); - } - } -} \ No newline at end of file Added: trunk/Source/StructureMap/Pipeline/ListCoercion.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ListCoercion.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/ListCoercion.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -0,0 +1,13 @@ +using System.Collections.Generic; +using System.Linq; + +namespace StructureMap.Pipeline +{ + public class ListCoercion<T> : IEnumerableCoercion where T : class + { + public object Convert(IEnumerable<object> enumerable) + { + return enumerable.Select(x => x as T).ToList(); + } + } +} \ No newline at end of file Deleted: trunk/Source/StructureMap/Pipeline/LiteralInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/LiteralInstance.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap/Pipeline/LiteralInstance.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -1,58 +0,0 @@ -using System; -using StructureMap.Graph; -using StructureMap.TypeRules; - -namespace StructureMap.Pipeline -{ - public class LiteralInstance : ExpressedInstance<LiteralInstance>, IDisposable - { - private object _object; - - public LiteralInstance(object anObject) - { - if (anObject == null) - { - throw new ArgumentNullException("anObject"); - } - - _object = anObject; - } - - - protected override LiteralInstance thisInstance - { - get { return this; } - } - - public object Object - { - get { return _object; } - } - - protected override object build(Type pluginType, BuildSession session) - { - return _object; - } - - - protected override bool canBePartOfPluginFamily(PluginFamily family) - { - return _object.GetType().CanBeCastTo(family.PluginType); - } - - protected override string getDescription() - { - return "Object: " + _object; - } - - public override string ToString() - { - return string.Format("LiteralInstance: {0}", _object); - } - - public void Dispose() - { - _object = null; - } - } -} \ No newline at end of file Copied: trunk/Source/StructureMap/Pipeline/ObjectInstance.cs (from rev 282, trunk/Source/StructureMap/Pipeline/LiteralInstance.cs) =================================================================== --- trunk/Source/StructureMap/Pipeline/ObjectInstance.cs (rev 0) +++ trunk/Source/StructureMap/Pipeline/ObjectInstance.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -0,0 +1,71 @@ +using System; +using StructureMap.Graph; +using StructureMap.TypeRules; + +namespace StructureMap.Pipeline +{ + public class NullInstance : Instance + { + protected override string getDescription() + { + return "NULL"; + } + + protected override object build(Type pluginType, BuildSession session) + { + return null; + } + } + + public class ObjectInstance : ExpressedInstance<ObjectInstance>, IDisposable + { + private object _object; + + public ObjectInstance(object anObject) + { + if (anObject == null) + { + throw new ArgumentNullException("anObject"); + } + + _object = anObject; + } + + + protected override ObjectInstance thisInstance + { + get { return this; } + } + + public object Object + { + get { return _object; } + } + + protected override object build(Type pluginType, BuildSession session) + { + return _object; + } + + + protected override bool canBePartOfPluginFamily(PluginFamily family) + { + return _object.GetType().CanBeCastTo(family.PluginType); + } + + protected override string getDescription() + { + return "Object: " + _object; + } + + public override string ToString() + { + return string.Format("LiteralInstance: {0}", _object); + } + + public void Dispose() + { + _object = null; + } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap/Pipeline/PropertyExpression.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/PropertyExpression.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap/Pipeline/PropertyExpression.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -28,7 +28,7 @@ _instance.SetProperty(_propertyName, propertyValue.ToString()); else { - _instance.SetChild(_propertyName,new LiteralInstance(propertyValue)); + _instance.Set(_propertyName,new ObjectInstance(propertyValue)); } return (T) _instance; } Modified: trunk/Source/StructureMap/Pipeline/SmartInstance.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/SmartInstance.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap/Pipeline/SmartInstance.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -366,7 +366,7 @@ /// <returns></returns> public SmartInstance<T> Is(CHILD value) { - return Is(new LiteralInstance(value)); + return Is(new ObjectInstance(value)); } /// <summary> Modified: trunk/Source/StructureMap/PipelineGraph.cs =================================================================== --- trunk/Source/StructureMap/PipelineGraph.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap/PipelineGraph.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -187,7 +187,7 @@ public Instance Inject<PLUGINTYPE>(PLUGINTYPE instance) { - var literalInstance = new LiteralInstance(instance); + var literalInstance = new ObjectInstance(instance); ForType(typeof (PLUGINTYPE)).AddInstance(literalInstance); SetDefault(typeof (PLUGINTYPE), literalInstance); Modified: trunk/Source/StructureMap/StructureMap.csproj =================================================================== --- trunk/Source/StructureMap/StructureMap.csproj 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap/StructureMap.csproj 2009-12-24 04:53:19 UTC (rev 285) @@ -158,13 +158,13 @@ <Compile Include="PipelineGraph.cs" /> <Compile Include="Pipeline\ConfiguredInstance.cs" /> <Compile Include="Pipeline\ConfiguredInstance.Expressions.cs" /> - <Compile Include="Pipeline\ConstructorInstance.cs" /> + <Compile Include="Pipeline\LambdaInstance.cs" /> <Compile Include="Pipeline\DefaultInstance.cs" /> <Compile Include="Pipeline\IConfiguredInstance.cs" /> <Compile Include="Pipeline\ILocationPolicy.cs" /> <Compile Include="Pipeline\Instance.cs" /> <Compile Include="Pipeline\InstanceMementoPropertyReader.cs" /> - <Compile Include="Pipeline\LiteralInstance.cs" /> + <Compile Include="Pipeline\ObjectInstance.cs" /> <Compile Include="Pipeline\Profile.cs" /> <Compile Include="Pipeline\ProfileManager.cs" /> <Compile Include="Pipeline\PrototypeInstance.cs" /> @@ -401,14 +401,19 @@ <Compile Include="Graph\PluginCache.cs" /> <Compile Include="Graph\SingleImplementationScanner.cs" /> <Compile Include="IContext.cs" /> + <Compile Include="Pipeline\ArrayCoercion.cs" /> <Compile Include="Pipeline\ConditionalInstance.cs" /> + <Compile Include="Pipeline\ConstructorInstance.cs" /> + <Compile Include="Pipeline\EnumerableInstance.cs" /> <Compile Include="Pipeline\HttpContextLifecycle.cs" /> <Compile Include="Pipeline\HttpLifecycleBase.cs" /> <Compile Include="Pipeline\HttpSessionLifecycle.cs" /> <Compile Include="Pipeline\HybridSessionLifecycle.cs" /> + <Compile Include="Pipeline\IEnumerableCoercion.cs" /> <Compile Include="Pipeline\ILifecycle.cs" /> <Compile Include="Pipeline\IObjectCache.cs" /> <Compile Include="Pipeline\Lifecycles.cs" /> + <Compile Include="Pipeline\ListCoercion.cs" /> <Compile Include="Pipeline\MainObjectCache.cs" /> <Compile Include="Pipeline\NulloObjectCache.cs" /> <Compile Include="Pipeline\ObjectBuilder.cs" /> Modified: trunk/Source/StructureMap/TypeExtensions.cs =================================================================== --- trunk/Source/StructureMap/TypeExtensions.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap/TypeExtensions.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -30,11 +30,12 @@ return new ReferencedInstance(key); } - public static bool IsGeneric(this Type type) + public static bool IsOpenGeneric(this Type type) { return type.IsGenericTypeDefinition || type.ContainsGenericParameters; } + public static bool IsConcreteAndAssignableTo(this Type pluggedType, Type pluginType) { return pluggedType.IsConcrete() && pluginType.IsAssignableFrom(pluggedType); @@ -124,12 +125,12 @@ return false; } - if (IsGeneric(pluginType)) + if (IsOpenGeneric(pluginType)) { return GenericsPluginGraph.CanBeCast(pluginType, pluggedType); } - if (IsGeneric(pluggedType)) + if (IsOpenGeneric(pluggedType)) { return false; } Modified: trunk/Source/StructureMap.AutoMocking/AutoMockedContainer.cs =================================================================== --- trunk/Source/StructureMap.AutoMocking/AutoMockedContainer.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap.AutoMocking/AutoMockedContainer.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -29,7 +29,7 @@ { object service = _locator.Service(pluginType); - var instance = new LiteralInstance(service); + var instance = new ObjectInstance(service); profileManager.SetDefault(pluginType, instance); } Modified: trunk/Source/StructureMap.Testing/BuildSessionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/BuildSessionTester.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap.Testing/BuildSessionTester.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -57,7 +57,7 @@ var session = new BuildSession(new PluginGraph()); var session2 = new BuildSession(new PluginGraph()); - var instance = new ConstructorInstance<ColorRule>(() => + var instance = new LambdaInstance<ColorRule>(() => { count++; return new ColorRule("Red"); @@ -98,7 +98,7 @@ int count = 0; var session = new BuildSession(new PluginGraph()); - var instance = new ConstructorInstance<ColorRule>(() => + var instance = new LambdaInstance<ColorRule>(() => { count++; return new ColorRule("Red"); @@ -121,7 +121,7 @@ { int count = 0; - var instance = new ConstructorInstance<ColorRule>(() => + var instance = new LambdaInstance<ColorRule>(() => { count++; return new ColorRule("Red"); @@ -221,8 +221,8 @@ PluginGraph graph = new PluginGraph(); PluginFamily family = graph.FindFamily(typeof(IService)); - family.AddInstance(new LiteralInstance(red).WithName("red")); - family.AddInstance(new LiteralInstance(green).WithName("green")); + family.AddInstance(new ObjectInstance(red).WithName("red")); + family.AddInstance(new ObjectInstance(green).WithName("green")); var session = new BuildSession(graph); session.TryGetInstance<IService>("red").ShouldBeTheSameAs(red); @@ -237,8 +237,8 @@ PluginGraph graph = new PluginGraph(); PluginFamily family = graph.FindFamily(typeof(IService)); - family.AddInstance(new LiteralInstance(red).WithName("red")); - family.AddInstance(new LiteralInstance(green).WithName("green")); + family.AddInstance(new ObjectInstance(red).WithName("red")); + family.AddInstance(new ObjectInstance(green).WithName("green")); var session = new BuildSession(graph); session.GetInstance<IService>("red").ShouldBeTheSameAs(red); Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/ProfileExpressionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/ProfileExpressionTester.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/ProfileExpressionTester.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -82,7 +82,7 @@ .For<IWidget>().Use(theWidget); PluginGraph graph = registry.Build(); - var instance = (LiteralInstance) graph.ProfileManager.GetDefault(typeof (IWidget), "something"); + var instance = (ObjectInstance) graph.ProfileManager.GetDefault(typeof (IWidget), "something"); Assert.AreSame(theWidget, instance.Object); } @@ -98,7 +98,7 @@ .For<IWidget>().UseNamedInstance(theDefaultName) .For<Rule>().UseNamedInstance("DefaultRule"); - LiteralInstance masterInstance = + ObjectInstance masterInstance = registry.InstanceOf<IWidget>().Is.Object(new AWidget()).WithName(theDefaultName); ProfileManager manager = registry.Build().ProfileManager; Modified: trunk/Source/StructureMap.Testing/Diagnostics/ValidationBuildSessionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Diagnostics/ValidationBuildSessionTester.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap.Testing/Diagnostics/ValidationBuildSessionTester.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -31,10 +31,10 @@ return session.BuildErrors[0]; } - private ConstructorInstance<IWidget> errorInstance() + private LambdaInstance<IWidget> errorInstance() { return - new ConstructorInstance<IWidget>(delegate() { throw new NotSupportedException("You can't make me!"); }); + new LambdaInstance<IWidget>(delegate() { throw new NotSupportedException("You can't make me!"); }); } [Test] @@ -157,7 +157,7 @@ { var session = new ValidationBuildSession(new PluginGraph()); - var instance = new LiteralInstance(new ColorWidget("Red")); + var instance = new ObjectInstance(new ColorWidget("Red")); object widget1 = session.CreateInstance(typeof (IWidget), instance); object widget2 = session.CreateInstance(typeof (IWidget), instance); @@ -177,7 +177,7 @@ [Test] public void Validate_a_single_object_with_both_a_passing_validation_method_and_a_failing_validation_method() { - var instance = new LiteralInstance(new WidgetWithOneValidationFailure()); + var instance = new ObjectInstance(new WidgetWithOneValidationFailure()); ValidationBuildSession session = validatedSession(registry => registry.InstanceOf<IWidget>().IsThis(instance)); Modified: trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap.Testing/Graph/DynamicInjectionTester.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -289,8 +289,8 @@ { IInstanceFactory factory = getISomethingFactory(); - factory.AddInstance(new LiteralInstance(_red).WithName("Red")); - factory.AddInstance(new LiteralInstance(_blue).WithName("Blue")); + factory.AddInstance(new ObjectInstance(_red).WithName("Red")); + factory.AddInstance(new ObjectInstance(_blue).WithName("Blue")); factory.FindInstance("Red").ShouldNotBeNull(); @@ -324,12 +324,12 @@ { IInstanceFactory factory = getISomethingFactory(); - factory.AddInstance(new LiteralInstance(_red).WithName("Red")); - var oldBlue = new LiteralInstance(_blue).WithName("Blue"); + factory.AddInstance(new ObjectInstance(_red).WithName("Red")); + var oldBlue = new ObjectInstance(_blue).WithName("Blue"); factory.AddInstance(oldBlue); // Replace Blue - var newBlue = new LiteralInstance(_orange).WithName("Blue"); + var newBlue = new ObjectInstance(_orange).WithName("Blue"); factory.AddInstance(newBlue); factory.FindInstance("Blue").ShouldBeTheSameAs(newBlue); Modified: trunk/Source/StructureMap.Testing/Graph/InstanceFactoryTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/InstanceFactoryTester.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap.Testing/Graph/InstanceFactoryTester.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -82,9 +82,9 @@ var factory = new InstanceFactory(typeof (IWidget)); var family = new PluginFamily(typeof (IWidget)); - family.AddInstance(new LiteralInstance(new AWidget()).WithName("New")); - family.AddInstance(new LiteralInstance(new AWidget()).WithName("New2")); - family.AddInstance(new LiteralInstance(new AWidget()).WithName("New3")); + family.AddInstance(new ObjectInstance(new AWidget()).WithName("New")); + family.AddInstance(new ObjectInstance(new AWidget()).WithName("New2")); + family.AddInstance(new ObjectInstance(new AWidget()).WithName("New3")); factory.ImportFrom(family); @@ -130,11 +130,11 @@ public void Merge_from_PluginFamily_will_not_replace_an_existing_instance() { var factory = new InstanceFactory(typeof (IWidget)); - LiteralInstance instance1 = new LiteralInstance(new AWidget()).WithName("New"); + ObjectInstance instance1 = new ObjectInstance(new AWidget()).WithName("New"); factory.AddInstance(instance1); var family = new PluginFamily(typeof (IWidget)); - family.AddInstance(new LiteralInstance(new AWidget()).WithName("New")); + family.AddInstance(new ObjectInstance(new AWidget()).WithName("New")); factory.ImportFrom(family); @@ -191,7 +191,7 @@ [Test] public void the_instances_are_cloned_so_that_new_instances_are_NOT_injected_into_() { - clone.AddInstance(new LiteralInstance(new DefaultGateway())); + clone.AddInstance(new ObjectInstance(new DefaultGateway())); factory.AllInstances.Count().ShouldEqual(2); clone.AllInstances.Count().ShouldEqual(3); Modified: trunk/Source/StructureMap.Testing/Graph/PluginFamilyMergeTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/PluginFamilyMergeTester.cs 2009-12-23 19:54:52 UTC (rev 284) +++ trunk/Source/StructureMap.Testing/Graph/PluginFamilyMergeTester.cs 2009-12-24 04:53:19 UTC (rev 285) @@ -12,7 +12,7 @@ public void Add_instance_that_does_not_exist_in_destination() { var source = new PluginFamily(typeof (IWidget)); - var sourceInstance = new LiteralInstance(new AWidget()); + var sourceInstance = new ObjectInstance(new AWidget()); source.AddInstance(sourceInstance); var destination = new PluginFamily(typeof (IWidget)); @@ -25,11 +25,11 @@ public void Do_not_override_named_instance() { var source = new PluginFamily(typeof (IWidget)); - LiteralInstance sourceInstance = new LiteralInstance(new AWidget()).WithName("New"); + ObjectInstance sourceInstance = new ObjectInstance(new AWidget()).WithName("New"); source.AddInstance(sourceInstance); var destination = new PluginFamily(typeof (IWidget)); - LiteralInstance destinationInstance = new LiteralInstance(new AWidget()).WithName("New"); + ObjectInstance destinationInstance = new ObjectInstance(new AWidget()).WithName("New"); destination.AddInstance(destinationInstance); destination.ImportFrom(source); Modified: trunk/Source/StructureMap.Testing/Graph/PluginTester.cs =================================================================== --- tru... [truncated message content] |
From: <fli...@us...> - 2009-12-23 19:55:04
|
Revision: 284 http://structuremap.svn.sourceforge.net/structuremap/?rev=284&view=rev Author: flimflan Date: 2009-12-23 19:54:52 +0000 (Wed, 23 Dec 2009) Log Message: ----------- Get rid of uses of obsolete InstanceOf<T> Modified Paths: -------------- trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs trunk/Source/StructureMap.AutoMocking/AutoMocker.cs Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs 2009-12-23 19:36:53 UTC (rev 283) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs 2009-12-23 19:54:52 UTC (rev 284) @@ -103,7 +103,12 @@ return alterAndContinue(family => family.AddInstance(instance)); } + public GenericFamilyExpression Add(object instance) + { + return Add(new LiteralInstance(instance)); + } + /// <summary> /// Sets the object creation of the instances of the PluginType. For example: PerRequest, /// Singleton, ThreadLocal, HttpContext, or Hybrid Modified: trunk/Source/StructureMap.AutoMocking/AutoMocker.cs =================================================================== --- trunk/Source/StructureMap.AutoMocking/AutoMocker.cs 2009-12-23 19:36:53 UTC (rev 283) +++ trunk/Source/StructureMap.AutoMocking/AutoMocker.cs 2009-12-23 19:54:52 UTC (rev 284) @@ -4,6 +4,7 @@ using System.Reflection; using StructureMap.Graph; using System.Linq; +using StructureMap.Pipeline; namespace StructureMap.AutoMocking { @@ -215,7 +216,7 @@ public T AddAdditionalMockFor<T>() where T : class { var mock = _serviceLocator.Service<T>(); - _container.Configure(r => r.InstanceOf<T>().Is.Object(mock)); + _container.Configure(r => r.For(typeof (T)).Add(mock)); return mock; } @@ -265,7 +266,7 @@ { foreach (T t in stubs) { - x.InstanceOf<T>().Is.Object(t); + x.For(typeof(T)).Add(t); } }); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-12-23 19:37:00
|
Revision: 283 http://structuremap.svn.sourceforge.net/structuremap/?rev=283&view=rev Author: jeremydmiller Date: 2009-12-23 19:36:53 +0000 (Wed, 23 Dec 2009) Log Message: ----------- added more convenience methods to the generic family expression Modified Paths: -------------- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs trunk/Source/StructureMap.DebuggerVisualizers.Testing/Program.cs trunk/Source/StructureMap.Testing/Diagnostics/DoctorTester.cs trunk/Source/StructureMap.Testing/Examples/Interception.cs trunk/Source/StructureMap.Testing/Examples/RegisteringWithTheAPI.cs trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj Added Paths: ----------- trunk/Source/StructureMap.Testing/Bugs/AddValueDirectlyWithGenericUsage.cs Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2009-12-21 23:11:23 UTC (rev 282) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/CreatePluginFamilyExpression.cs 2009-12-23 19:36:53 UTC (rev 283) @@ -81,6 +81,7 @@ /// </summary> /// <typeparam name="CONCRETETYPE"></typeparam> /// <returns></returns> + [Obsolete("Prefer the usage For<ISomething>().Use<Something>()")] public CreatePluginFamilyExpression<PLUGINTYPE> TheDefaultIsConcreteType<CONCRETETYPE>() where CONCRETETYPE : PLUGINTYPE { Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs 2009-12-21 23:11:23 UTC (rev 282) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs 2009-12-23 19:36:53 UTC (rev 283) @@ -67,6 +67,19 @@ return TheDefaultIsConcreteType(concreteType); } + /// <summary> + /// Shortcut to add a value by type + /// </summary> + /// <param name="value"></param> + /// <returns></returns> + public LiteralInstance Use(object value) + { + var instance = new LiteralInstance(value); + Use(instance); + + return instance; + } + /// <summary> /// Shortcut method to add an additional Instance to this Plugin Type Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs 2009-12-21 23:11:23 UTC (rev 282) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/InstanceExpression.cs 2009-12-23 19:36:53 UTC (rev 283) @@ -103,6 +103,7 @@ /// </summary> /// <typeparam name="PLUGGEDTYPE"></typeparam> /// <returns></returns> + [Obsolete("Favor For<ISomething>().Use<Something>()")] SmartInstance<PLUGGEDTYPE> OfConcreteType<PLUGGEDTYPE>() where PLUGGEDTYPE : T; /// <summary> @@ -112,6 +113,7 @@ /// </summary> /// <param name="type"></param> /// <returns></returns> + [Obsolete("Favor For<ISomething>().Use(typeof(Something))")] ConfiguredInstance OfConcreteType(Type type); /// <summary> @@ -120,6 +122,7 @@ /// </summary> /// <param name="func"></param> /// <returns></returns> + [Obsolete("Prefer For<T>().Use(Func<T> func) or For<T>().Add(Func<T> func)")] ConstructorInstance<T> ConstructedBy(Func<T> func); /// <summary> Modified: trunk/Source/StructureMap.DebuggerVisualizers.Testing/Program.cs =================================================================== --- trunk/Source/StructureMap.DebuggerVisualizers.Testing/Program.cs 2009-12-21 23:11:23 UTC (rev 282) +++ trunk/Source/StructureMap.DebuggerVisualizers.Testing/Program.cs 2009-12-23 19:36:53 UTC (rev 283) @@ -1,4 +1,4 @@ -using System.Diagnostics; +using System.Diagnostics; using System.Windows.Forms; namespace StructureMap.DebuggerVisualizers.Testing Added: trunk/Source/StructureMap.Testing/Bugs/AddValueDirectlyWithGenericUsage.cs =================================================================== --- trunk/Source/StructureMap.Testing/Bugs/AddValueDirectlyWithGenericUsage.cs (rev 0) +++ trunk/Source/StructureMap.Testing/Bugs/AddValueDirectlyWithGenericUsage.cs 2009-12-23 19:36:53 UTC (rev 283) @@ -0,0 +1,23 @@ +using NUnit.Framework; +using StructureMap.Testing.Widget; + +namespace StructureMap.Testing.Bugs +{ + [TestFixture] + public class AddValueDirectlyWithGenericUsage + { + [SetUp] + public void SetUp() + { + } + + [Test] + public void should_be_able_to_resolve_from_the_generic_family_expression() + { + var widget = new AWidget(); + var container = new Container(x => x.For(typeof (IWidget)).Use(widget).WithName("mine")); + + container.GetInstance<IWidget>("mine").ShouldBeTheSameAs(widget); + } + } +} \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Diagnostics/DoctorTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Diagnostics/DoctorTester.cs 2009-12-21 23:11:23 UTC (rev 282) +++ trunk/Source/StructureMap.Testing/Diagnostics/DoctorTester.cs 2009-12-23 19:36:53 UTC (rev 283) @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics; using System.IO; using System.Reflection; Modified: trunk/Source/StructureMap.Testing/Examples/Interception.cs =================================================================== --- trunk/Source/StructureMap.Testing/Examples/Interception.cs 2009-12-21 23:11:23 UTC (rev 282) +++ trunk/Source/StructureMap.Testing/Examples/Interception.cs 2009-12-23 19:36:53 UTC (rev 283) @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices.ComTypes; Modified: trunk/Source/StructureMap.Testing/Examples/RegisteringWithTheAPI.cs =================================================================== --- trunk/Source/StructureMap.Testing/Examples/RegisteringWithTheAPI.cs 2009-12-21 23:11:23 UTC (rev 282) +++ trunk/Source/StructureMap.Testing/Examples/RegisteringWithTheAPI.cs 2009-12-23 19:36:53 UTC (rev 283) @@ -1,4 +1,4 @@ -using StructureMap.Configuration.DSL; +using StructureMap.Configuration.DSL; namespace StructureMap.Testing.Examples { Modified: trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj =================================================================== --- trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-12-21 23:11:23 UTC (rev 282) +++ trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-12-23 19:36:53 UTC (rev 283) @@ -178,6 +178,7 @@ <Compile Include="AutoMocking\RhinoMockRepositoryProxyTester.cs" /> <Compile Include="AutoWiringExamples.cs" /> <Compile Include="BidirectionalDependencies.cs" /> + <Compile Include="Bugs\AddValueDirectlyWithGenericUsage.cs" /> <Compile Include="Bugs\BuildUpBug.cs" /> <Compile Include="Bugs\FillAllPropertiesShouldWorkForAlreadyConfiguredPluginsBug.cs" /> <Compile Include="Bugs\HttpSessionNullRefBug.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fli...@us...> - 2009-12-21 23:11:33
|
Revision: 282 http://structuremap.svn.sourceforge.net/structuremap/?rev=282&view=rev Author: flimflan Date: 2009-12-21 23:11:23 +0000 (Mon, 21 Dec 2009) Log Message: ----------- Allow specifying a child array by type for a configured instance without using generics. Modified Paths: -------------- trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs 2009-12-19 04:03:09 UTC (rev 281) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstance.Expressions.cs 2009-12-21 23:11:23 UTC (rev 282) @@ -96,6 +96,14 @@ return new ChildArrayExpression(this, propertyName); } + public ChildArrayExpression ChildArray(Type pluginType) + { + //TODO: add validation check + validateTypeIsArray(pluginType); + var propertyName = findPropertyName(pluginType); + return ChildArray(propertyName); + } + /// <summary> /// Inline definition of a dependency array like IService[] or IHandler[] /// </summary> @@ -103,10 +111,7 @@ /// <returns></returns> public ChildArrayExpression ChildArray<PLUGINTYPE>() { - validateTypeIsArray<PLUGINTYPE>(); - - string propertyName = findPropertyName<PLUGINTYPE>(); - return ChildArray<PLUGINTYPE>(propertyName); + return ChildArray(typeof (PLUGINTYPE)); } /// <summary> Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs 2009-12-19 04:03:09 UTC (rev 281) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs 2009-12-21 23:11:23 UTC (rev 282) @@ -255,7 +255,12 @@ protected static void validateTypeIsArray<PLUGINTYPE>() { - if (!typeof (PLUGINTYPE).IsArray) + validateTypeIsArray(typeof(PLUGINTYPE)); + } + + protected static void validateTypeIsArray(Type pluginType) + { + if (!pluginType.IsArray) { throw new StructureMapException(307); } Modified: trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs 2009-12-19 04:03:09 UTC (rev 281) +++ trunk/Source/StructureMap.Testing/Pipeline/ConfiguredInstanceTester.cs 2009-12-21 23:11:23 UTC (rev 282) @@ -198,6 +198,40 @@ } [Test] + public void HasProperty_for_generic_child_array_when_property_name_is_inferred() + { + var instance = new ConfiguredInstance(typeof(UsesGateways)); + + IConfiguredInstance configuredInstance = instance; + configuredInstance.HasProperty("gateways").ShouldBeFalse(); + + instance.ChildArray<IGateway[]>().Contains(new DefaultInstance()); + configuredInstance.HasProperty("gateways").ShouldBeTrue(); + } + + [Test] + public void HasProperty_for_child_array_when_property_name_is_inferred() + { + var instance = new ConfiguredInstance(typeof(UsesGateways)); + + IConfiguredInstance configuredInstance = instance; + configuredInstance.HasProperty("gateways").ShouldBeFalse(); + + instance.ChildArray(typeof(IGateway[])).Contains(new DefaultInstance()); + configuredInstance.HasProperty("gateways").ShouldBeTrue(); + } + + public class UsesGateways + { + private readonly IGateway[] _gateways; + + public UsesGateways(IGateway[] gateways) + { + _gateways = gateways; + } + } + + [Test] public void Property_cannot_be_found_so_throw_205() { try This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-12-19 04:50:23
|
Revision: 281 http://structuremap.svn.sourceforge.net/structuremap/?rev=281&view=rev Author: jeremydmiller Date: 2009-12-19 04:03:09 +0000 (Sat, 19 Dec 2009) Log Message: ----------- marking some old stuff obsolete Modified Paths: -------------- trunk/Source/StructureMap/Configuration/DSL/Registry.cs Modified: trunk/Source/StructureMap/Configuration/DSL/Registry.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2009-12-19 03:41:43 UTC (rev 280) +++ trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2009-12-19 04:03:09 UTC (rev 281) @@ -8,55 +8,8 @@ namespace StructureMap.Configuration.DSL { - public interface IRegistry - { - // Registering Types -- BuildInstancesOf() and ForRequestedType() are Synonyms - CreatePluginFamilyExpression<PLUGINTYPE> BuildInstancesOf<PLUGINTYPE>(); - CreatePluginFamilyExpression<PLUGINTYPE> ForRequestedType<PLUGINTYPE>(); - - GenericFamilyExpression ForRequestedType(Type pluginType); - // Shortcut for configuring the default configuration of a concrete type - Registry.BuildWithExpression<T> ForConcreteType<T>(); - // Adding additional Instances of a PluginType - IsExpression<T> InstanceOf<T>(); - GenericIsExpression InstanceOf(Type pluginType); - - // Creating or Adding to a Profile - ProfileExpression CreateProfile(string profileName); - void CreateProfile(string profileName, Action<ProfileExpression> action); - - // Interception - void RegisterInterceptor(TypeInterceptor interceptor); - MatchedTypeInterceptor IfTypeMatches(Predicate<Type> match); - - // Type Scanning and Auto Registration - void Scan(Action<IAssemblyScanner> action); - - // Controlling Setter Injection Behavior - CreatePluginFamilyExpression<PLUGINTYPE> FillAllPropertiesOfType<PLUGINTYPE>(); - void SetAllProperties(Action<SetterConvention> action); - - /// <summary> - /// Use to programmatically select the constructor function of a concrete - /// class. Applies globally to all Containers in a single AppDomain. - /// </summary> - /// <typeparam name="T"></typeparam> - /// <param name="expression"></param> - void SelectConstructor<T>(Expression<Func<T>> expression); - - /// <summary> - /// Use to "forward" the request for FROM to the default of TO - /// Useful for singleton services that implement multiple - /// interface roles - /// </summary> - /// <typeparam name="FROM"></typeparam> - /// <typeparam name="TO"></typeparam> - void Forward<FROM, TO>() where FROM : class where TO : class; - } - - /// <summary> /// A Registry class provides methods and grammars for configuring a Container or ObjectFactory. /// Using a Registry subclass is the recommended way of configuring a StructureMap Container. @@ -70,7 +23,7 @@ /// } /// } /// </example> - public class Registry : IRegistry + public class Registry { private readonly List<Action<PluginGraph>> _actions = new List<Action<PluginGraph>>(); private readonly List<Action> _basicActions = new List<Action>(); @@ -123,6 +76,7 @@ /// </summary> /// <typeparam name="PLUGINTYPE"></typeparam> /// <returns></returns> + [Obsolete("Change to For<T>()")] public CreatePluginFamilyExpression<PLUGINTYPE> BuildInstancesOf<PLUGINTYPE>() { return new CreatePluginFamilyExpression<PLUGINTYPE>(this); @@ -134,6 +88,7 @@ /// meant for registering open generic types /// </summary> /// <returns></returns> + [Obsolete("Change to For(pluginType)")] public GenericFamilyExpression ForRequestedType(Type pluginType) { return new GenericFamilyExpression(pluginType, this); @@ -160,6 +115,7 @@ /// </summary> /// <typeparam name="PLUGINTYPE"></typeparam> /// <returns></returns> + [Obsolete("Change to For<T>()")] public CreatePluginFamilyExpression<PLUGINTYPE> ForRequestedType<PLUGINTYPE>() { return new CreatePluginFamilyExpression<PLUGINTYPE>(this); @@ -195,6 +151,7 @@ /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> + [Obsolete("Prefer For<T>().Add() instead")] public IsExpression<T> InstanceOf<T>() { return new InstanceExpression<T>(instance => @@ -210,6 +167,7 @@ /// </summary> /// <param name="pluginType"></param> /// <returns></returns> + [Obsolete("Prefer For(type).Add() instead")] public GenericIsExpression InstanceOf(Type pluginType) { return This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-12-19 03:41:54
|
Revision: 280 http://structuremap.svn.sourceforge.net/structuremap/?rev=280&view=rev Author: jeremydmiller Date: 2009-12-19 03:41:43 +0000 (Sat, 19 Dec 2009) Log Message: ----------- killed off the obsolete configure() method in Registry. Modified Paths: -------------- trunk/Source/StructureMap/Configuration/DSL/Registry.cs trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryTester.cs trunk/Source/StructureMap.Testing.Widget5/WidgetRegistry.cs Modified: trunk/Source/StructureMap/Configuration/DSL/Registry.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2009-12-19 03:05:37 UTC (rev 279) +++ trunk/Source/StructureMap/Configuration/DSL/Registry.cs 2009-12-19 03:41:43 UTC (rev 280) @@ -75,19 +75,22 @@ private readonly List<Action<PluginGraph>> _actions = new List<Action<PluginGraph>>(); private readonly List<Action> _basicActions = new List<Action>(); - public Registry() + /// <summary> + /// Imports the configuration from another registry into this registry. + /// </summary> + /// <typeparam name="T"></typeparam> + public void IncludeRegistry<T>() where T : Registry, new() { - configure(); + _actions.Add(g => new T().ConfigurePluginGraph(g)); } /// <summary> - /// You can overide this method as a place to put the Registry DSL - /// declarations. This is not mandatory. + /// Imports the configuration from another registry into this registry. /// </summary> - [Obsolete("configure() is unnecessary. All declarations can be made in the constructor of a Registry or any other method")] - protected virtual void configure() + /// <param name="registry"></param> + public void IncludeRegistry(Registry registry) { - // no-op; + _actions.Add(registry.ConfigurePluginGraph); } protected void registerAction(Action action) Modified: trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryTester.cs 2009-12-19 03:05:37 UTC (rev 279) +++ trunk/Source/StructureMap.Testing/Configuration/DSL/RegistryTester.cs 2009-12-19 03:41:43 UTC (rev 280) @@ -88,15 +88,17 @@ { private int _count; + public TestRegistry2() + { + _count++; + } + public int ExecutedCount { get { return _count; } } - protected override void configure() - { - _count++; - } + } public class FakeGateway : IGateway Modified: trunk/Source/StructureMap.Testing.Widget5/WidgetRegistry.cs =================================================================== --- trunk/Source/StructureMap.Testing.Widget5/WidgetRegistry.cs 2009-12-19 03:05:37 UTC (rev 279) +++ trunk/Source/StructureMap.Testing.Widget5/WidgetRegistry.cs 2009-12-19 03:41:43 UTC (rev 280) @@ -5,7 +5,7 @@ { public class RedGreenRegistry : Registry { - protected override void configure() + public RedGreenRegistry() { InstanceOf<IWidget>().Is.OfConcreteType<ColorWidget>().WithCtorArg("color").EqualTo("Red").WithName("Red"); InstanceOf<IWidget>().Is.OfConcreteType<ColorWidget>().WithCtorArg("color").EqualTo("Green").WithName( @@ -29,14 +29,13 @@ public class YellowBlueRegistry : Registry { - protected override void configure() + public YellowBlueRegistry() { InstanceOf<IWidget>().Is.OfConcreteType<ColorWidget>().WithCtorArg("color").EqualTo("Yellow").WithName( "Yellow"); InstanceOf<IWidget>().Is.OfConcreteType<ColorWidget>().WithProperty("color").EqualTo("Blue").WithName("Blue"); } - public override bool Equals(object obj) { if (this == obj) return true; @@ -68,7 +67,7 @@ public class BrownBlackRegistry : Registry { - protected override void configure() + public BrownBlackRegistry() { InstanceOf<IWidget>().Is.OfConcreteType<ColorWidget>().WithProperty("color").EqualTo("Brown").WithName( "Brown"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-12-19 03:05:47
|
Revision: 279 http://structuremap.svn.sourceforge.net/structuremap/?rev=279&view=rev Author: jeremydmiller Date: 2009-12-19 03:05:37 +0000 (Sat, 19 Dec 2009) Log Message: ----------- Fixing an old, old bug with defensive programming being too tight around checking CanCastTo() Modified Paths: -------------- trunk/Source/StructureMap/Graph/FindAllTypesFilter.cs trunk/Source/StructureMap/InstanceBuilderList.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs trunk/Source/StructureMap/TypeExtensions.cs trunk/Source/StructureMap.Testing/Graph/TypeFindingTester.cs trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj Added Paths: ----------- trunk/Source/StructureMap.Testing/Bugs/InjectByFuncWithNoPublicConstructors.cs Modified: trunk/Source/StructureMap/Graph/FindAllTypesFilter.cs =================================================================== --- trunk/Source/StructureMap/Graph/FindAllTypesFilter.cs 2009-12-19 02:29:03 UTC (rev 278) +++ trunk/Source/StructureMap/Graph/FindAllTypesFilter.cs 2009-12-19 03:05:37 UTC (rev 279) @@ -22,10 +22,11 @@ public void Process(Type type, PluginGraph graph) { - if (!type.CanBeCastTo(_pluginType)) return; - - var name = _getName(type); - graph.AddType(_pluginType, type, name); + if (type.CanBeCastTo(_pluginType) && Constructor.HasConstructors(type)) + { + var name = _getName(type); + graph.AddType(_pluginType, type, name); + } } #endregion Modified: trunk/Source/StructureMap/InstanceBuilderList.cs =================================================================== --- trunk/Source/StructureMap/InstanceBuilderList.cs 2009-12-19 02:29:03 UTC (rev 278) +++ trunk/Source/StructureMap/InstanceBuilderList.cs 2009-12-19 03:05:37 UTC (rev 279) @@ -43,7 +43,7 @@ } // Add a missing PluggedType if we can - if (pluggedType.CanBeCastTo(_pluginType)) + if (pluggedType.CanBeCastTo(_pluginType) && Constructor.HasConstructors(pluggedType)) { var plugin = new Plugin(pluggedType); processPlugin(plugin); Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs 2009-12-19 02:29:03 UTC (rev 278) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs 2009-12-19 03:05:37 UTC (rev 279) @@ -179,7 +179,7 @@ protected override bool canBePartOfPluginFamily(PluginFamily family) { - return _pluggedType.CanBeCastTo(family.PluginType); + return _pluggedType.CanBeCastTo(family.PluginType) && Constructor.HasConstructors(_pluggedType); } internal override bool Matches(Plugin plugin) Modified: trunk/Source/StructureMap/TypeExtensions.cs =================================================================== --- trunk/Source/StructureMap/TypeExtensions.cs 2009-12-19 02:29:03 UTC (rev 278) +++ trunk/Source/StructureMap/TypeExtensions.cs 2009-12-19 03:05:37 UTC (rev 279) @@ -124,11 +124,6 @@ return false; } - if (noPublicConstructors(pluggedType)) - { - return false; - } - if (IsGeneric(pluginType)) { return GenericsPluginGraph.CanBeCast(pluginType, pluggedType); @@ -164,11 +159,6 @@ return returnValue; } - private static bool noPublicConstructors(Type pluggedType) - { - return pluggedType.GetConstructors().Length == 0; - } - public static bool IsString(this Type type) { return type.Equals(typeof(string)); Added: trunk/Source/StructureMap.Testing/Bugs/InjectByFuncWithNoPublicConstructors.cs =================================================================== --- trunk/Source/StructureMap.Testing/Bugs/InjectByFuncWithNoPublicConstructors.cs (rev 0) +++ trunk/Source/StructureMap.Testing/Bugs/InjectByFuncWithNoPublicConstructors.cs 2009-12-19 03:05:37 UTC (rev 279) @@ -0,0 +1,34 @@ +using NUnit.Framework; + +namespace StructureMap.Testing.Bugs +{ + [TestFixture] + public class InjectByFuncWithNoPublicConstructors + { + [SetUp] + public void SetUp() + { + } + + [Test] + public void register_with_generic() + { + var container = new Container(x => + { + x.For<ClassThatIsBuiltByStatic>().Use(c => ClassThatIsBuiltByStatic.Build()); + }); + + container.GetInstance<ClassThatIsBuiltByStatic>().ShouldNotBeNull(); + } + } + + public class ClassThatIsBuiltByStatic + { + public static ClassThatIsBuiltByStatic Build() + { + return new ClassThatIsBuiltByStatic(); + } + + private ClassThatIsBuiltByStatic(){} + } +} \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Graph/TypeFindingTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Graph/TypeFindingTester.cs 2009-12-19 02:29:03 UTC (rev 278) +++ trunk/Source/StructureMap.Testing/Graph/TypeFindingTester.cs 2009-12-19 03:05:37 UTC (rev 279) @@ -29,13 +29,7 @@ private IContainer container; - [Test] - public void DoNotFindPluginWithNoPublicCTOR() - { - Assert.IsFalse(typeof (GreenType).CanBeCastTo(typeof (TypeIWantToFind))); - } - [Test] public void FoundTheRightNumberOfInstancesForATypeWithNoPlugins() { Modified: trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj =================================================================== --- trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-12-19 02:29:03 UTC (rev 278) +++ trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-12-19 03:05:37 UTC (rev 279) @@ -182,6 +182,7 @@ <Compile Include="Bugs\FillAllPropertiesShouldWorkForAlreadyConfiguredPluginsBug.cs" /> <Compile Include="Bugs\HttpSessionNullRefBug.cs" /> <Compile Include="Bugs\IDictionaryAndXmlBugTester.cs" /> + <Compile Include="Bugs\InjectByFuncWithNoPublicConstructors.cs" /> <Compile Include="Bugs\LambdaCreatesNullBugTester.cs" /> <Compile Include="Bugs\MixedConfigureAndInitializeMissingInstanceProblem.cs" /> <Compile Include="Bugs\ScanIndexerBugTester.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-12-19 02:29:11
|
Revision: 278 http://structuremap.svn.sourceforge.net/structuremap/?rev=278&view=rev Author: jeremydmiller Date: 2009-12-19 02:29:03 +0000 (Sat, 19 Dec 2009) Log Message: ----------- fixing a lil' bitty bug with TryGetInstance and open generic types Modified Paths: -------------- trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs trunk/Source/StructureMap/Container.cs trunk/Source/StructureMap/Emitting/InstanceBuilderAssembly.cs trunk/Source/StructureMap/Extensions.cs trunk/Source/StructureMap/Graph/Plugin.cs trunk/Source/StructureMap/Graph/PluginCache.cs trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs trunk/Source/StructureMap/PipelineGraph.cs trunk/Source/StructureMap/TypeExtensions.cs trunk/Source/StructureMap.Testing/Pipeline/NestedContainerSupportTester.cs trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj Added Paths: ----------- trunk/Source/StructureMap.Testing/Bugs/TryGetInstanceWithOpenGenericsBugTester.cs Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs 2009-12-05 18:40:41 UTC (rev 277) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs 2009-12-19 02:29:03 UTC (rev 278) @@ -90,6 +90,7 @@ return alterAndContinue(family => family.AddInstance(instance)); } + /// <summary> /// Sets the object creation of the instances of the PluginType. For example: PerRequest, /// Singleton, ThreadLocal, HttpContext, or Hybrid Modified: trunk/Source/StructureMap/Container.cs =================================================================== --- trunk/Source/StructureMap/Container.cs 2009-12-05 18:40:41 UTC (rev 277) +++ trunk/Source/StructureMap/Container.cs 2009-12-19 02:29:03 UTC (rev 278) @@ -447,7 +447,7 @@ }; // Fixes a mild bug. The child container should inject itself - container._pipelineGraph.Inject<IContainer>(container); + container.Configure(x => x.For<IContainer>().Use(container)); return container; } Modified: trunk/Source/StructureMap/Emitting/InstanceBuilderAssembly.cs =================================================================== --- trunk/Source/StructureMap/Emitting/InstanceBuilderAssembly.cs 2009-12-05 18:40:41 UTC (rev 277) +++ trunk/Source/StructureMap/Emitting/InstanceBuilderAssembly.cs 2009-12-19 02:29:03 UTC (rev 278) @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Reflection; using StructureMap.Graph; +using System.Linq; namespace StructureMap.Emitting { @@ -18,10 +19,7 @@ string assemblyName = "Builders" + guidString(); _dynamicAssembly = new DynamicAssembly(assemblyName); - foreach (Plugin plugin in plugins) - { - processPlugin(plugin); - } + plugins.Where(x => x.IsNotOpenGeneric()).Each(x => processPlugin(x)); } private static string guidString() Modified: trunk/Source/StructureMap/Extensions.cs =================================================================== --- trunk/Source/StructureMap/Extensions.cs 2009-12-05 18:40:41 UTC (rev 277) +++ trunk/Source/StructureMap/Extensions.cs 2009-12-19 02:29:03 UTC (rev 278) @@ -7,6 +7,16 @@ { internal static class StringExtensions { + public static IEnumerable<T> Each<T>(this IEnumerable<T> enumerable, Action<T> action) + { + foreach (T target in enumerable) + { + action(target); + } + + return enumerable; + } + public static string ToFormat(this string template, params object[] parameters) { return string.Format(template, parameters); Modified: trunk/Source/StructureMap/Graph/Plugin.cs =================================================================== --- trunk/Source/StructureMap/Graph/Plugin.cs 2009-12-05 18:40:41 UTC (rev 277) +++ trunk/Source/StructureMap/Graph/Plugin.cs 2009-12-19 02:29:03 UTC (rev 278) @@ -3,6 +3,7 @@ using System.Linq.Expressions; using System.Reflection; using StructureMap.Pipeline; +using StructureMap.TypeRules; namespace StructureMap.Graph { @@ -165,5 +166,10 @@ { _setters.UseSetterRule(rule); } + + public bool IsNotOpenGeneric() + { + return !_pluggedType.IsGeneric(); + } } } \ No newline at end of file Modified: trunk/Source/StructureMap/Graph/PluginCache.cs =================================================================== --- trunk/Source/StructureMap/Graph/PluginCache.cs 2009-12-05 18:40:41 UTC (rev 277) +++ trunk/Source/StructureMap/Graph/PluginCache.cs 2009-12-19 02:29:03 UTC (rev 278) @@ -4,6 +4,7 @@ using System.Reflection; using StructureMap.Emitting; using StructureMap.Util; +using StructureMap.TypeRules; namespace StructureMap.Graph { Modified: trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs =================================================================== --- trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs 2009-12-05 18:40:41 UTC (rev 277) +++ trunk/Source/StructureMap/Pipeline/ConfiguredInstanceBase.cs 2009-12-19 02:29:03 UTC (rev 278) @@ -202,7 +202,16 @@ { if (instance == null) return; - _children.Add(name, instance); + if (_children.ContainsKey(name)) + { + _children[name] = instance; + } + else + { + _children.Add(name, instance); + } + + } protected void setChildArray(string name, Instance[] array) Modified: trunk/Source/StructureMap/PipelineGraph.cs =================================================================== --- trunk/Source/StructureMap/PipelineGraph.cs 2009-12-05 18:40:41 UTC (rev 277) +++ trunk/Source/StructureMap/PipelineGraph.cs 2009-12-19 02:29:03 UTC (rev 278) @@ -4,6 +4,7 @@ using StructureMap.Diagnostics; using StructureMap.Graph; using StructureMap.Pipeline; +using StructureMap.TypeRules; namespace StructureMap { @@ -228,10 +229,13 @@ public bool HasDefaultForPluginType(Type pluginType) { - var typeToFind = pluginType.IsGenericType ? pluginType.GetGenericTypeDefinition() : pluginType; - var configuration = PluginTypes.FirstOrDefault(p => p.PluginType == typeToFind); - - return configuration == null ? false : configuration.Default != null; + var factory = ForType(pluginType); + if (_profileManager.GetDefault(pluginType) != null) + { + return true; + } + + return (factory.AllInstances.Count() == 1); } public bool HasInstance(Type pluginType, string instanceKey) Modified: trunk/Source/StructureMap/TypeExtensions.cs =================================================================== --- trunk/Source/StructureMap/TypeExtensions.cs 2009-12-05 18:40:41 UTC (rev 277) +++ trunk/Source/StructureMap/TypeExtensions.cs 2009-12-19 02:29:03 UTC (rev 278) @@ -8,6 +8,17 @@ { public static class TypeExtensions { + public static bool Closes(this Type type, Type openType) + { + var baseType = type.BaseType; + if (baseType == null) return false; + + var closes = baseType.IsGenericType && baseType.GetGenericTypeDefinition() == openType; + if (closes) return true; + + return type.BaseType == null ? false : type.BaseType.Closes(openType); + } + public static bool IsInNamespace(this Type type, string nameSpace) { return type.Namespace.StartsWith(nameSpace); @@ -48,13 +59,20 @@ { if (!pluggedType.IsConcrete()) return null; - foreach (var interfaceType in pluggedType.GetInterfaces()) + if (templateType.IsInterface) { - if (interfaceType.IsGenericType && interfaceType.GetGenericTypeDefinition() == templateType) + foreach (var interfaceType in pluggedType.GetInterfaces()) { - return interfaceType; + if (interfaceType.IsGenericType && interfaceType.GetGenericTypeDefinition() == templateType) + { + return interfaceType; + } } } + else if (pluggedType.BaseType.IsGenericType && pluggedType.BaseType.GetGenericTypeDefinition() == templateType) + { + return pluggedType.BaseType; + } return pluggedType.BaseType == typeof(object) ? null : pluggedType.BaseType.FindInterfaceThatCloses(templateType); } @@ -183,7 +201,7 @@ public static bool IsConcrete(this Type type) { - return !type.IsAbstract; + return !type.IsAbstract && !type.IsInterface; } public static bool IsAutoFillable(this Type type) Added: trunk/Source/StructureMap.Testing/Bugs/TryGetInstanceWithOpenGenericsBugTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Bugs/TryGetInstanceWithOpenGenericsBugTester.cs (rev 0) +++ trunk/Source/StructureMap.Testing/Bugs/TryGetInstanceWithOpenGenericsBugTester.cs 2009-12-19 02:29:03 UTC (rev 278) @@ -0,0 +1,57 @@ +using System.Diagnostics; +using NUnit.Framework; +using StructureMap.TypeRules; + +namespace StructureMap.Testing.Bugs +{ + [TestFixture] + public class TryGetInstanceWithOpenGenericsBugTester + { + [SetUp] + public void SetUp() + { + } + + [Test] + public void can_get_closing_type_if_starting_from_a_base_type() + { + typeof (ClosedClass<string>).FindInterfaceThatCloses(typeof (IOpenClass<>)).ShouldEqual( + typeof (IOpenClass<string>)); + + + } + + [Test] + public void try_get_instance_fills_from_open_generic() + { + var container = new Container(x => + { + x.For(typeof(IOpenClass<>)).AddType(typeof(ClosedClass<>)); + }); + + container.TryGetInstance<IOpenClass<string>>().ShouldBeOfType<ClosedClass<string>>(); + } + + [Test] + public void try_get_instance_fills_from_open_generic_on_conventions() + { + var container = new Container(x => + { + x.Scan(o => + { + o.TheCallingAssembly(); + o.ConnectImplementationsToTypesClosing(typeof(IOpenClass<>)); + }); + }); + + Debug.WriteLine(container.WhatDoIHave()); + + container.GetInstance<IOpenClass<string>>().ShouldBeOfType<ClosedStringClass>(); + container.TryGetInstance<IOpenClass<string>>().ShouldBeOfType<ClosedStringClass>(); + } + } + + public class IOpenClass<T>{} + public class ClosedClass<T> : IOpenClass<T>{} + public class ClosedStringClass : IOpenClass<string>{} +} \ No newline at end of file Modified: trunk/Source/StructureMap.Testing/Pipeline/NestedContainerSupportTester.cs =================================================================== --- trunk/Source/StructureMap.Testing/Pipeline/NestedContainerSupportTester.cs 2009-12-05 18:40:41 UTC (rev 277) +++ trunk/Source/StructureMap.Testing/Pipeline/NestedContainerSupportTester.cs 2009-12-19 02:29:03 UTC (rev 278) @@ -14,7 +14,32 @@ { } + public class ContainerHolder + { + private readonly IContainer _container; + + public ContainerHolder(IContainer container) + { + _container = container; + } + + public IContainer Container { get { return _container; } } + } + [Test] + public void the_nested_container_will_deliver_itself_into_a_constructor_of_something_else() + { + var parent = new Container(x => + { + x.For<IWidget>().Use<AWidget>(); + }); + + var child = parent.GetNestedContainer(); + child.GetInstance<ContainerHolder>().Container.ShouldBeTheSameAs(child); + + } + + [Test] public void the_nested_container_delivers_itself_as_the_IContainer() { var parent = new Container(x => Modified: trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj =================================================================== --- trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-12-05 18:40:41 UTC (rev 277) +++ trunk/Source/StructureMap.Testing/StructureMap.Testing.csproj 2009-12-19 02:29:03 UTC (rev 278) @@ -189,6 +189,7 @@ <Compile Include="Bugs\SpecifyScopeInConfigureTester.cs" /> <Compile Include="Bugs\SpecifyScopeOnOpenGenericsTester.cs" /> <Compile Include="Bugs\StaticPropertyCausesJITExceptionTester.cs" /> + <Compile Include="Bugs\TryGetInstanceWithOpenGenericsBugTester.cs" /> <Compile Include="BuildSessionTester.cs" /> <Compile Include="BuildUpIntegratedTester.cs" /> <Compile Include="BuildUpTester.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jer...@us...> - 2009-12-05 18:40:48
|
Revision: 277 http://structuremap.svn.sourceforge.net/structuremap/?rev=277&view=rev Author: jeremydmiller Date: 2009-12-05 18:40:41 +0000 (Sat, 05 Dec 2009) Log Message: ----------- convenience method on GenericFamilyExpression that I needed for FubuMVC Modified Paths: -------------- trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs Modified: trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs =================================================================== --- trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs 2009-12-04 23:00:27 UTC (rev 276) +++ trunk/Source/StructureMap/Configuration/DSL/Expressions/GenericFamilyExpression.cs 2009-12-05 18:40:41 UTC (rev 277) @@ -85,7 +85,7 @@ } - private GenericFamilyExpression add(Instance instance) + public GenericFamilyExpression Add(Instance instance) { return alterAndContinue(family => family.AddInstance(instance)); } @@ -176,9 +176,11 @@ /// <returns></returns> public GenericFamilyExpression AddConcreteType(Type concreteType) { - return add(new ConfiguredInstance(concreteType)); + var instance = new ConfiguredInstance(concreteType); + return Add(instance); } + /// <summary> /// Shortcut method to add an additional Instance to this Plugin Type /// as just a Concrete Type by a specified name. You can also chain other declarations after @@ -189,7 +191,7 @@ /// <returns></returns> public GenericFamilyExpression AddConcreteType(Type concreteType, string instanceName) { - return add(new ConfiguredInstance(concreteType).WithName(instanceName)); + return Add(new ConfiguredInstance(concreteType).WithName(instanceName)); } } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fli...@us...> - 2009-12-04 23:00:37
|
Revision: 276 http://structuremap.svn.sourceforge.net/structuremap/?rev=276&view=rev Author: flimflan Date: 2009-12-04 23:00:27 +0000 (Fri, 04 Dec 2009) Log Message: ----------- Clean archive folder during build so that only the latest built is stored as an artifact on teamcity.codebetter Modified Paths: -------------- trunk/CleanUp.BAT trunk/cruise.build Modified: trunk/CleanUp.BAT =================================================================== --- trunk/CleanUp.BAT 2009-12-03 20:54:50 UTC (rev 275) +++ trunk/CleanUp.BAT 2009-12-04 23:00:27 UTC (rev 276) @@ -1,2 +1,2 @@ -bin\nant\nant.exe -buildfile:StructureMap.build post-clean +bin\nant\nant.exe -buildfile:cruise.build post-clean pause Modified: trunk/cruise.build =================================================================== --- trunk/cruise.build 2009-12-03 20:54:50 UTC (rev 275) +++ trunk/cruise.build 2009-12-04 23:00:27 UTC (rev 276) @@ -13,10 +13,11 @@ <target name="pre-clean"> <delete dir="${build.dir}" failonerror="false" /> <delete dir="${results.dir}" failonerror="false"/> + <delete dir="${archive.dir}" failonerror="false" /> <mkdir dir="${build.dir}" /> <mkdir dir="${results.dir}" /> - <mkdir dir="${archive.dir}" unless="${directory::exists(archive.dir)}" /> + <mkdir dir="${archive.dir}" /> <call target="cleanJunk" /> </target> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |