2016-06-22 4 views
0

StructMap 작업에서 정책을 사용하는 방법에 대한 example 2을 얻으려고합니다. 작은 테스트 프로젝트 (아래 코드)를 만들었습니다. 아쉽게도 .As<type>.Each이 모두 작동하지 않기 때문에 어떤 이유로 인해 종속성 문제가있는 것으로 보입니다. 내가 오류를 얻고있다 As 같은 StructureMap의 정책 사용 예제에 대한 누락 된 종속성

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

로 사용하여 라인에 대한

는 :

'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-Statement를 넣었지만 여전히 문제가 있습니다.

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() 확장 기능과 동일한 기능입니다.