StructureMap - >选择具有参数的特定构造函数

时间:2016-02-23 23:00:32

标签: c# constructor structuremap

我正在尝试使用结构图来获取StackExchangeRedisCacheClient https://github.com/imperugo/StackExchange.Redis.Extensions/blob/master/src/StackExchange.Redis.Extensions.Core/StackExchangeRedisCacheClient.cs的实例

我已经看到了有关指定无参数构造函数而不是带参数的构造函数的其他问题。但是,我想指定一个具有参数的特定构造函数。

我找不到任何这方面的例子。

我想使用这个构造函数:

public StackExchangeRedisCacheClient(ISerializer serializer, IRedisCachingConfiguration configuration = null)

我希望StructureMap获取ISerializer的实例并为IRedisCachingConfiguration提供null。我怎么能这样做?

我想做类似的事情,但它不起作用:

For<ISerializer>().Singleton().Use<JilSerializer>().SelectConstructor(() => new JilSerializer());
For<ICacheClient>().Singleton().Use<StackExchangeRedisCacheClient>().SelectConstructor(() => new StackExchangeRedisCacheClient(GetInstance<ISerializer>, null));

1 个答案:

答案 0 :(得分:1)

如果使用返回IRedisCachingConfiguration的null实例的工厂函数配置容器,它应该可以工作。实际的实例不需要在SelectConstructor表达式中解析,因为它只用于匹配构造函数,因此也就是空值。

For<ISerializer>().Singleton().Use<JilSerializer>();
For<IRedisCachingConfiguration>().Singleton()
    .Use("null config", () => (IRedisCachingConfiguration)null);
For<ICacheClient>().Singleton()
    .Use<StackExchangeRedisCacheClient>()
    .SelectConstructor(() => new StackExchangeRedisCacheClient(
        (ISerializer)null,
        (IRedisCachingConfiguration)null));

或者另一种方法是为ICacheClient配置工厂函数,只需调用所需的构造函数,绕过配置null IRedisCachingConfiguration的需要。

For<ICacheClient>().Singleton().Use(c => 
    new StackExchangeRedisCacheClient(c.GetInstance<ISerializer>(), null));