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

时间:2014-10-15 09:44:31

标签: .net inversion-of-control structuremap structuremap3

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

e.g。我有一些服务合同

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

2 个答案:

答案 0 :(得分: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 docs中的文档。

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

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

并配置容器。

x.Policies.ConstructorSelector<ParamLessConstructorSelector>();

答案 1 :(得分:0)

您可以指定要用于特定类型的构造函数。在某处:

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

有关详细信息,请参阅documentation

编辑:

对于StructureMap3,它将是:

x.Policies.ConstructorSelector(...)