3

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

例如,我有一些服务合同

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

2 回答 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>();
于 2014-10-15T20:02:59.710 回答
0

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

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

有关更多信息,请参阅文档

编辑:

对于 StructureMap3,它将是:

x.Policies.ConstructorSelector(...)
于 2014-10-15T09:51:11.700 回答