.net 如何告诉StructureMap 3为特定类型使用特定构造函数?

.net 如何告诉StructureMap 3为特定类型使用特定构造函数?,.net,inversion-of-control,structuremap,structuremap3,.net,Inversion Of Control,Structuremap,Structuremap3,我在Web API项目中使用StructureMap(版本3.1.4.143)进行一般依赖项解析,到目前为止,它运行良好。 我希望structuremap遵循其默认行为,即选择具有大多数参数的构造函数。但是,对于特定类型,我希望使用特定的构造函数 e、 我有一些服务合同 public interface IService { void DoSomething(); } 和实现类似 public class Service : IService { public Servic

我在Web API项目中使用StructureMap(版本3.1.4.143)进行一般依赖项解析,到目前为止,它运行良好。 我希望structuremap遵循其默认行为,即选择具有大多数参数的构造函数。但是,对于特定类型,我希望使用特定的构造函数

e、 我有一些服务合同

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();

您可以指定用于特定类型的构造函数。大致如下:

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

回答我自己的问题:

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

x.ForConcreteType<Service>().Configure.SelectConstructor(() => new Service());
以及配置容器

x.Policies.ConstructorSelector<ParamLessConstructorSelector>();
x.Policies.ConstructorSelector();

可能与StructureMap 3重复,我看不出该答案适用于StructureMap 3。它在StructureMap 3中可用吗?在哪个名称空间下?对于StructureMap3,它应该在Policies.constructorSelector中。例如,如果我想选择一个具有2个参数的构造函数,代码会是什么样子?@GrantBirchmeier
pluggedType.GetConstructors()。首先(x=>x.GetParameters().Count()==2)
应该这样做。请注意,如果您有多个具有2个参数的构造函数,则可能需要更多的逻辑来指定所需的构造函数。
x.ForConcreteType<Service>().Configure.SelectConstructor(() => new Service());
x.For<IService>().Use<Service>().SelectConstructor(() => new Service());
public class ParamLessConstructorSelector : IConstructorSelector
{
    public ConstructorInfo Find(Type pluggedType)
    {
        return pluggedType.GetConstructors().First(x => x.GetParameters().Count() == 0);
    }
}
x.Policies.ConstructorSelector<ParamLessConstructorSelector>();