结构映射 -> 选择带有参数的特定构造函数

本文关键字:参数 构造函数 映射 选择 结构 | 更新日期: 2023-09-27 18:35:52

我正在尝试使用结构映射来获取StackExchangeRedisCacheCacheClient的实例 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));

结构映射 -> 选择带有参数的特定构造函数

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

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 配置工厂函数,并简单地调用您想要的构造函数,而无需配置空IRedisCachingConfiguration

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