Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net StructureMap GetAllInstances在需要多个实例时返回一个实例_.net_Structuremap_Structuremap4 - Fatal编程技术网

.net StructureMap GetAllInstances在需要多个实例时返回一个实例

.net StructureMap GetAllInstances在需要多个实例时返回一个实例,.net,structuremap,structuremap4,.net,Structuremap,Structuremap4,我有一个基于命令修改记录的应用程序。我使用StructureMap作为容器,它的行为与我预期的不一样 应用程序有几个命令来更新某些业务实体。我有许多FluentValidation验证器来验证这些命令。一些命令共享相同的字段,我将这些字段拉入接口。我已经在这些接口上实现了一些验证器 //example command public class MoveCommand : IMoveAction, IConfigurationAction { public string Secti

我有一个基于命令修改记录的应用程序。我使用StructureMap作为容器,它的行为与我预期的不一样

应用程序有几个命令来更新某些业务实体。我有许多FluentValidation验证器来验证这些命令。一些命令共享相同的字段,我将这些字段拉入接口。我已经在这些接口上实现了一些验证器

//example command
public class MoveCommand
    : IMoveAction, IConfigurationAction
{
    public string Section { get; set; }
    public string Bank { get; set; }
    public string Slot { get; set; }
    public List<Configuration> Configurations { get; set; }
}

//Interfaces
public interface IConfigurationAction
{
    List<Configuration> Configurations { get; set; }
}

public interface IMoveAction
{
    string Section { get; set; }
    string Bank { get; set; }
    string Slot { get; set; }
}

//Validators
public class GameConfigurationValidator
    : AbstractValidator<IConfigurationAction>
{
    public GameConfigurationValidator()
    {
        RuleFor(action => action.Configurations).NotEmpty();
    }
}

public class MoveActionValidator
    : AbstractValidator<IMoveAction>
{
    public MoveActionValidator()
    {
        RuleFor(action => action.Section).NotEmpty();
        RuleFor(action => action.Bank).NotEmpty();
        RuleFor(action => action.Slot).NotEmpty();
    }
}
//示例命令
公共类移动命令
:i移动操作,i配置操作
{
公共字符串部分{get;set;}
公共字符串库{get;set;}
公共字符串槽{get;set;}
公共列表配置{get;set;}
}
//接口
公共接口IConfigurationAction
{
列表配置{get;set;}
}
公共接口移动
{
字符串部分{get;set;}
字符串组{get;set;}
字符串槽{get;set;}
}
//验证器
公共类GameConfigurationValidator
:抽象验证器
{
公共游戏配置验证器()
{
RuleFor(action=>action.Configurations).NotEmpty();
}
}
公共类MoveActionValidator
:抽象验证器
{
public MoveActionValidator()
{
RuleFor(action=>action.Section).NotEmpty();
RuleFor(action=>action.Bank).NotEmpty();
RuleFor(action=>action.Slot).NotEmpty();
}
}
我正在这样配置StructureMap容器

var container = new StructureMap.Container(cfg =>
{
    cfg.Scan(scanner =>
    {
        scanner.AssemblyContainingType(typeof(Program));  //Everything is in same assembly as Program
        scanner.AddAllTypesOf(typeof(IValidator<>));
    });

});
var container=newstructuremap.container(cfg=>
{
cfg.Scan(扫描器=>
{
scanner.AssemblyContainingType(typeof(Program));//所有内容都与程序位于同一程序集中
scanner.AddAllTypesOf(typeof(IValidator));
});
});
当我尝试检索MoveCommand的验证器时,
var validators=container.GetAllInstances(),我希望得到两个验证器,GameConfigurationValidator和MoveActionValidator,但是GetAllInstances只返回GameConfigurationValidator。如果我首先定义MoveActionValidator,则返回它,但不返回GameConfigurationValidator

使用GetAllInstances(即GameConfigurationValidator和MoveActionValidator)时,我需要做什么才能获取MoveCommand的所有验证程序

完整示例(需要StructureMap和ServiceStack nuget软件包):

使用System.Collections.Generic;
使用ServiceStack.FluentValidation;
命名空间控制台应用程序5
{
班级计划
{
静态void Main(字符串[]参数)
{
var container=new StructureMap.container(cfg=>
{
cfg.Scan(扫描器=>
{
scanner.AssemblyContainingType(typeof(Program));
scanner.AddAllTypesOf(typeof(IValidator));
});
});
var stuff=container.WhatDoIHave();
//IValidator ServiceStack.FluentValidation瞬态合并应用程序5.GameConfigurationValidator(默认)
//IValidator ServiceStack.FluentValidation瞬态合并应用程序5.MoveActionValidator(默认)
var validators=container.GetAllInstances();
}
}
公共类GameConfigurationValidator
:抽象验证器
{
公共游戏配置验证器()
{
RuleFor(action=>action.Configurations).NotEmpty();
}
}
公共类MoveActionValidator
:抽象验证器
{
public MoveActionValidator()
{
RuleFor(action=>action.Section).NotEmpty();
RuleFor(action=>action.Bank).NotEmpty();
RuleFor(action=>action.Slot).NotEmpty();
}
}
公共接口IConfigurationAction
{
列表配置{get;set;}
}
公共接口移动
{
字符串部分{get;set;}
字符串组{get;set;}
字符串槽{get;set;}
}
公共类配置
{
公共字符串主题{get;set;}
公共十进制面额{get;set;}
公共字符串PAR{GET;SET;}
}
公共类移动命令
:i移动操作,i配置操作
{
公共字符串部分{get;set;}
公共字符串库{get;set;}
公共字符串槽{get;set;}
公共列表配置{get;set;}
}
}
您想要什么

scanner.ConnectImplementationsToTypesClosing(typeof (IValidator<>));
scanner.connectionImplementationstotypesClosing(typeof(ivalidor));
而不是

scanner.AddAllTypesOf(typeof(IValidator<>));
scanner.AddAllTypesOf(typeof(IValidator));

请参见

谢谢,这解决了问题。您知道调试StructureMap注册的更好方法吗?我目前依赖IContainer.What我必须获得注册内容的报告,但无论是使用
ConnectionImplementationsToTypesClosing
还是
AddAllTypesOf
scanner.AddAllTypesOf(typeof(IValidator<>));