2016-06-22 3 views
0

StructureMapでポリシーを使用する方法のexample 2を取得しようとしています。私は小さなテストプロジェクト(以下のコード)を作成しました。残念ながら、何らかの理由で、.As<type>.Eachの両方が動作していないため、依存関係の問題があるようです。このようStructureMapでポリシーを使用する例の依存関係がありません

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

としてAsを使用してラインのための

私はエラーを取得しています:

'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.

私はNuGetを使用してのStructureMap 4.2をインストールしました。下のコードでわかるように、構造マップのusing文をすべて入れましたが、それでも問題は残ります。

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

答えて

0

私はテストで使用As<T>()拡張メソッドは、BCLの一部ではなく、あなたがそれを見つけていない理由です。あなたがShouldlyを使用している場合は、同じことをShouldBeOfType<T>()で行うか、または比較を行う前に通常通りキャストすることができます。拡張子がEach()のものと同じです。

関連する問題