Search code examples
c#structuremapstructuremap3

Structuremap all instances of abstract


Using Net 4.5.1 and StructureMap 3.1.4

I have services that extending an abstract class:

 public abstract class Charting<T> {

   protected readonly String baseConfigurationString;

   public Charting(String baseConfigurationString)
   {
      this.baseConfigurationString = baseConfigurationString;
   }

   ...
 }

For every concrete service I want to set the baseConfigurationString. Right now I am doing it individually per service:

 public class MyRegistry : Registry
 {
    public MyRegistry()
    {
        Profile("Development", x => {
            ForConcreteType<AveragePartySizeChart>().Configure.Ctor<String>("baseConfigurationString").Is(MyDbConfiguration.getBaseConnectionString());

            ...next service....about 6 total
        });
    }
 }

Is there anyway to do this generally acting against the abstract class despite it having a generic qualifier?


Solution

  • My suggestion, and what we did with StructureMap for configuration within FubuMVC, is to create a class something like:

    public class ConnectionSettings
    {
        public string Connection {get;set;}
    }
    

    and resolve that through StructureMap as a singleton. Then in any class that needs the connection string, just do:

    public abstract class DatabaseConnectionUser
    {
        public DatabaseConnectionUser(ConnectionSettings settings){}
    }
    

    Autowiring will connect your ConnectionSettings object to all the class objects that take in that object in their constructor function.

    You could try using a custom IPluginGraphConfiguration class in StructureMap 3 to set the ctor argument explicitly on all Instance's that build a subclass, but I think that would be more work.