使用StructureMap时传递构造函数参数

Mos*_*osh 40 structuremap constructor dependency-injection

我在我的DI中使用StructureMap.想象一下,我有一个类需要1个参数:

public class ProductProvider : IProductProvider
{
     public ProductProvider(string connectionString)
     { 
         ....
     }
}
Run Code Online (Sandbox Code Playgroud)

当我得到IProductProvider的实例时,我需要在运行时指定"connectionString" .

我已经按如下方式配置了StructureMap:

ForRequestedType<IProductProvider>.TheDefault.Is.OfConcreteType<ProductProvider>().  
WithCtorArgument("connectionString");
Run Code Online (Sandbox Code Playgroud)

但是,我不想在这里调用EqualTo("something ......")方法,因为我需要一些工具来在运行时动态指定此值.

我的问题是:如何通过使用ObjectFactory获取IProductProvider的实例?

目前,我有类似的东西:

ObjectFactory.GetInstance<IProductProvider>();  
Run Code Online (Sandbox Code Playgroud)

但是如你所知,这不起作用......

任何建议将不胜感激.

Mic*_*eth 54

我建议使用StructureMap配置声明.使用稍微更新的StructureMap代码:

For<IProductProvider>().Use<ProductProvider>
  .Ctor<string>("connectionString").Is(someValueAtRunTime);
Run Code Online (Sandbox Code Playgroud)

这样,您不必担心客户端代码必须知道该值,并且可以使您的IoC配置与主代码分开.

  • 我猜这是你配置StructureMap的地方.你怎么在那里传递`someValueAtRunTime`? (5认同)

Mos*_*osh 32

我自己找到了答案!这是解决方案:

ObjectFactory.With("connectionString").EqualTo(someValueAtRunTime).GetInstance<IProductProvider>();
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助遇到同样问题的其他人.

  • 呦.如果我有几个参数,arg1,2,3等等.我想按原样传递每个参数,但保持其中一个args为null.这该怎么做? (5认同)