2016-06-22 17 views
0

Ich versuche, example 2 der Verwendung von Richtlinien in StructureMap arbeiten. Ich habe ein kleines Testprojekt erstellt (Code unten). Leider gibt es aus irgendeinem Grund einige Abhängigkeitsprobleme, da die .As<type> und .Each beide nicht funktionieren.Fehlende Abhängigkeiten für ein Beispiel für die Verwendung von Richtlinien in StructureMap

Für die Linien mit As wie

user.Green.As<Database>().ConnectionString.ShouldBe("*green*"); 

ich die Störung erhalte:

'IDatabase' does not contain a definition for 'As' and no extension method 'As' accepting a first argument of type 'IDatabase' could be found (are you missing a using directive or assembly reference?). And for this line:

instance.Constructor.GetParameters() 
       .Where(x => x.ParameterType == typeof(IDatabase)) 
       .Each(param => ... 

'StringExtensions.Each(IEnumberable,Action)' is inaccessible due to its protection level.

Ich installierte StructureMap 4.2 NuGet verwenden. Wie Sie im folgenden Code sehen können, habe ich alle using -Statements von StructureMap, die ich finden konnte, eingefügt, aber ich habe immer noch das Problem.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using StructureMap; 
using StructureMap.Pipeline; 
using StructureMap.Pipeline.Lazy; 
using StructureMap.Configuration; 
using StructureMap.Building; 
using StructureMap.Attributes; 
using StructureMap.AutoMocking; 
using StructureMap.Graph; 
using StructureMap.Query; 
using StructureMap.TypeRules; 
using StructureMap.Util; 
using StructureMap.Building.Interception; 
using StructureMap.Configuration.DSL; 
using StructureMap.Diagnostics.TreeView; 
using StructureMap.Graph.Scanning; 

namespace TestStructureMapPolicies 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var container = new Container(_ => 
      { 
       _.For<IDatabase>().Add<Database>().Named("red") 
        .Ctor<string>("connectionString").Is("*red*"); 

       _.For<IDatabase>().Add<Database>().Named("green") 
        .Ctor<string>("connectionString").Is("*green*"); 

       _.Policies.Add<InjectDatabaseByName>(); 
      }); 


      // ImportantService should get the "red" database 
      container.GetInstance<ImportantService>() 
       .DB.As<Database>().ConnectionString.ShouldBe("*red*"); 

      // BigService should get the "green" database 
      container.GetInstance<BigService>() 
       .DB.As<Database>().ConnectionString.ShouldBe("*green*"); 

      // DoubleDatabaseUser gets both 
      var user = container.GetInstance<DoubleDatabaseUser>(); 

      user.Green.As<Database>().ConnectionString.ShouldBe("*green*"); 
      user.Red.As<Database>().ConnectionString.ShouldBe("*red*"); 

     } 
    } 

    public interface IDatabase { } 

    public class Database : IDatabase 
    { 
     public string ConnectionString { get; set; } 

     public Database(string connectionString) 
     { 
      ConnectionString = connectionString; 
     } 

     public override string ToString() 
     { 
      return string.Format("ConnectionString: {0}", ConnectionString); 
     } 
    } 

    public class InjectDatabaseByName : ConfiguredInstancePolicy 
    { 
     protected override void apply(Type pluginType, IConfiguredInstance instance) 
     { 
      instance.Constructor.GetParameters() 
       .Where(x => x.ParameterType == typeof(IDatabase)) 
       .Each(param => 
       { 
         // Using ReferencedInstance here tells StructureMap 
         // to "use the IDatabase by this name" 
         var db = new ReferencedInstance(param.Name); 
        instance.Dependencies.AddForConstructorParameter(param, db); 
       }); 
     } 
    } 

    public class BigService 
    { 
     public BigService(IDatabase green) 
     { 
      DB = green; 
     } 

     public IDatabase DB { get; set; } 
    } 

    public class ImportantService 
    { 
     public ImportantService(IDatabase red) 
     { 
      DB = red; 
     } 

     public IDatabase DB { get; set; } 
    } 

    public class DoubleDatabaseUser 
    { 
     public DoubleDatabaseUser(IDatabase red, IDatabase green) 
     { 
      Red = red; 
      Green = green; 
     } 

     // Watch out for potential conflicts between setters 
     // and ctor params. The easiest thing is to just make 
     // setters private 
     public IDatabase Green { get; private set; } 
     public IDatabase Red { get; private set; } 
    } 
} 

Antwort

0

Die As<T>() Erweiterung Methode, die ich in den Tests verwendet wird, nicht Teil des BCL und das ist, warum Sie finden es nicht. Wenn Sie Shuldgly verwenden, können Sie dasselbe mit ShouldBeOfType<T>() oder einfach normal vor dem Vergleich durchführen. Das Gleiche gilt für die Erweiterung Each().