2016-04-14 12 views
3

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; } 
    } 
} 

Antwort

2

Sie

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

statt

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

Structure Map: Generic Types

+0

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 –