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

StructureMap -> Choose a Specific Constructor with Parameters

我正在尝试使用结构图来获取 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 提供一个空值。我该怎么做?

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

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

如果您使用 returns IRedisCachingConfiguration 的空实例的工厂函数配置容器,它应该可以工作。实际实例不需要在 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));