如何告诉StructureMap 3使用特定的构造函数来创建特定类型的实例?

3

我正在使用StructureMap(版本3.1.4.143)来进行Web API项目中的一般依赖项解析,目前它运行良好。

我希望StructureMap遵循其默认行为,选择具有最多参数的构造函数。然而,对于特定类型,我想要使用特定的构造函数。

例如,我有一些服务契约。

public interface IService 
{
    void DoSomething();
}

以及实现类似于

public class Service : IService 
{
    public Service() { //something }
    public Service(IRepo repo, ILogger logger) { //something }
    //rest of the logic
}

仅对于这种类型,我想使用无参数构造函数。在StructureMap 3中如何实现?(我可以通过创建IConstructorSelector实例并将其作为策略应用于所有类型来实现此目的)

x.Policies.ConstructorSelector<ParamLessConstructorSelector>();

可能是Telling StructureMap to use another Constructor的重复问题。 - asfaloth.arwen
我认为那个答案在StructureMap 3上不适用。 - Arghya C
2个回答

4

回答我的问题:

以下是在StructureMap 3中实现的正确方法。使用SelectConstructor,structuremap从给定的表达式中推断构造函数。

x.ForConcreteType<Service>().Configure.SelectConstructor(() => new Service());

或者,可以使用For-Use-mapping进行指定。
x.For<IService>().Use<Service>().SelectConstructor(() => new Service());

请查看Github StructureMap 文档以获取更多相关技术信息。

如果需要在整个应用程序中应用此规则,则可以通过创建IConstructorSelector实例将该规则应用为策略。

public class ParamLessConstructorSelector : IConstructorSelector
{
    public ConstructorInfo Find(Type pluggedType)
    {
        return pluggedType.GetConstructors().First(x => x.GetParameters().Count() == 0);
    }
}

并配置容器。

x.Policies.ConstructorSelector<ParamLessConstructorSelector>();

如果我想选择一个有两个参数的构造函数,那么代码会是什么样子? - Grant Birchmeier
1
pluggedType.GetConstructors().First(x => x.GetParameters().Count() == 2) 可以实现。请注意,如果您有多个带有2个参数的构造函数,则可能需要更多逻辑来指定所需的构造函数。 - Arghya C

0

您可以指定特定类型使用哪个构造函数。大致如下:

x.SelectConstructor<Service>(() => new Service());

请查看文档以获取更多信息。

编辑:

对于StructureMap3,应该是:

x.Policies.ConstructorSelector(...)

StructureMap 3 中有这个东西吗?在哪个命名空间下? - Arghya C
对于StructureMap3,它应该在Policies.ConstructorSelector中。 - asfaloth.arwen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接