Ich habe eine Anwendung, die Datensätze basierend auf Befehlen ändert. Ich verwende StructureMap als meinen Container und es verhält sich nicht wie erwartet.StructureMap GetAllInstances gibt eine Instanz zurück, wenn mehrere erwartet werden
Die Anwendung verfügt über mehrere Befehle zum Aktualisieren einiger Geschäftsentitäten. Ich habe eine Reihe von FluentValidation-Validatoren, um diese Befehle zu validieren. Einige der Befehle teilen dieselben Felder, die ich in Schnittstellen herausgezogen habe. Ich habe einige umgesetzt Validatoren auf diesen Schnittstellen
//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();
}
}
Ich bin wie so die StructureMap Container Konfiguration
var container = new StructureMap.Container(cfg =>
{
cfg.Scan(scanner =>
{
scanner.AssemblyContainingType(typeof(Program)); //Everything is in same assembly as Program
scanner.AddAllTypesOf(typeof(IValidator<>));
});
});
Wenn ich versuche, die Validatoren für MoveCommand abzurufen, var validators = container.GetAllInstances<IValidator<MoveCommand>>();
, ich würde erwarten, zwei zu bekommen Validatoren, GameConfigurationValidator und MoveActionValidator, aber GetAllInstances gibt nur den GameConfigurationValidator zurück. Wenn ich zuerst den MoveActionValidator definiere, wird dieser zurückgegeben, aber nicht der GameConfigurationValidator.
Was muss ich tun, um alle Validatoren für den MoveCommand zu erhalten, wenn GetAllInstances verwendet wird, d. H. Sowohl GameConfigurationValidator als auch MoveActionValidator?
Voll Beispiel (erfordert StructureMap und ServiceStack nuget Pakete):
using System.Collections.Generic;
using ServiceStack.FluentValidation;
namespace ConsoleApplication5
{
class Program
{
static void Main(string[] args)
{
var container = new StructureMap.Container(cfg =>
{
cfg.Scan(scanner =>
{
scanner.AssemblyContainingType(typeof(Program));
scanner.AddAllTypesOf(typeof(IValidator<>));
});
});
var stuff = container.WhatDoIHave();
//IValidator<IConfigurationAction> ServiceStack.FluentValidation Transient ConsoleApplication5.GameConfigurationValidator (Default)
//IValidator<IMoveAction> ServiceStack.FluentValidation Transient ConsoleApplication5.MoveActionValidator (Default)
var validators = container.GetAllInstances<IValidator<MoveCommand>>();
}
}
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();
}
}
public interface IConfigurationAction
{
List<Configuration> Configurations { get; set; }
}
public interface IMoveAction
{
string Section { get; set; }
string Bank { get; set; }
string Slot { get; set; }
}
public class Configuration
{
public string Theme { get; set; }
public decimal Denomination { get; set; }
public string Par { get; set; }
}
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; }
}
}
Dank sehen wollen dieses s hat das Problem geklärt. Kennen Sie eine bessere Möglichkeit, StructurMap-Registrierungen zu debuggen? Ich verlasse mich derzeit auf IContainer.WhatDoIHave, um einen Bericht von registrierten Dingen zu erhalten, aber ich bekomme den gleichen Bericht, ob ich 'ConnectImplementationsToTypesClosing' oder' AddAllTypesOf' verwende –