0
votes

I have attempted a simple program to try out configuration based constructor injection. Here is the code:

using StructureMap;
namespace StructureMapConfig
{
    class Program
    {
        static void Main(string[] args)
        {
            ObjectFactory.Initialize(x =>
                {
                    x.PullConfigurationFromAppConfig = true;
                });

            var result = ObjectFactory.GetInstance<IIConstructor>();
        }
    }

    public interface IIConstructor
    {
    }

    public class Constructor : IIConstructor
    {
        public Constructor(bool test)
        {

        }
    }
}

Here is my configuration file:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="StructureMap"
             type="StructureMap.Configuration.StructureMapConfigurationSection,StructureMap"/>
  </configSections>
  <StructureMap>
    <DefaultInstance MementoStyle="Attribute"
                     PluginType="StructureMapConfig.IIConstructor,StructureMapConfig"
                     PluggedType="StructureMapConfig.Constructor,StructureMapConfig"
                     test="false"/>
  </StructureMap>
  <startup>
    <supportedRuntime version="v4.0"
                      sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>

I keep getting a large stack trace when reading the config file, boiling down to this error:

Trying to visit parameter test of type System.Boolean in the constructor for StructureMapConfig.Constructor, StructureMapConfig, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null ---> StructureMap.StructureMapException: StructureMap Exception Code: 205 Missing requested Instance property "test" for InstanceKey "DefaultInstanceOfStructureMapConfig.IIConstructor, StructureMapConfig, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

The code definitely has a constructor argument called "test" and the destination type is correct - a boolean.

Can someone please give me guidance as to where I'm going wrong?

--

Note: I want to keep this in configuration only, as it will require a re-compile if this value is changed from "false" to "true", hence defeating the point of defining it in config.

1

1 Answers

1
votes

Got it,

"MementoStyle" should be on the <StructureMap> element, not on the <DefaultInstance>