Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Passing constructor arguments when using StructureMap

I'm using StructureMap for my DI. Imagine I have a class that takes 1 argument like:

public class ProductProvider : IProductProvider {      public ProductProvider(string connectionString)      {           ....      } } 

I need to specify the "connectionString at run-time when I get an instance of IProductProvider.

I have configured StructureMap as follows:

ForRequestedType<IProductProvider>.TheDefault.Is.OfConcreteType<ProductProvider>().   WithCtorArgument("connectionString"); 

However, I don't want to call EqualTo("something...") method here as I need some facility to dynamically specify this value at run-time.

My question is: how can I get an instance of IProductProvider by using ObjectFactory?

Currently, I have something like:

ObjectFactory.GetInstance<IProductProvider>();   

But as you know, this doesn't work...

Any advice would be greatly appreciated.

like image 700
Mosh Avatar asked May 13 '10 02:05

Mosh


2 Answers

I suggest declaring that with the StructureMap configuration. Using the slightly newer StructureMap code:

For<IProductProvider>().Use<ProductProvider>   .Ctor<string>("connectionString").Is(someValueAtRunTime); 

This way you don't burden your client code from having to know the value and can keep your IoC configuration separate from your main code.

like image 169
Michael Hedgpeth Avatar answered Oct 02 '22 20:10

Michael Hedgpeth


I found the answer myself! Here is the solution:

ObjectFactory.With("connectionString").EqualTo(someValueAtRunTime).GetInstance<IProductProvider>(); 

Hope this helps others who have come across the same issue.

like image 36
Mosh Avatar answered Oct 02 '22 20:10

Mosh