2015-01-21 7 views
0

나는StructureMap3 모든 유형에 대해 생성자 문자열 삽입을 구성하는 방법은 무엇입니까?

Scan(
    scan => { 
     scan.TheCallingAssembly(); 
     scan.WithDefaultConventions(); 
     scan.With(new ControllerConvention()); 
    }); 

를 사용하여 내 유형을 등록하지만 내가 어떻게 알아 이런 구체적인 유형을 지정할 필요와 생성자 주입 지정합니까?

string connStr = "..."; 
For<IRepository().Use<MyRepository>().Ctor<string>("connectionString").Is(connStr); 

답변

1

리포지토리 등록 전용 컨벤션을 만들 수 있습니다.

public class RepositoryConvention : IRegistrationConvention 
{ 
    private const string ConnectionString = "your connection string"; 

    public void Process(Type type, Registry registry) 
    { 
     if (type.IsConcrete() && type.GetInterfaces().Contains(typeof(IRepository))) 
     { 
      registry.For(typeof(IRepository)) 
       .Use(type) 
       .CtorDependency<string>("connectionString") 
       .Is(ConnectionString); 
     } 
    } 
} 

또는 연결 문자열을 제공하는 전용 유형을 만듭니다. 나는 당신이 web/app.config에서 그것을 얻고 있기 때문에 그것을 액세스하기위한 추상화를 추가하는 것이 도움이 될 것이라고 확신한다.

public interface IConfigurationSettingsReader 
{ 
    string ReadConnectionString(string name); 
    T ReadSetting<T>(string settingName); 
} 

그런 다음 당신은 당신의 MyRepository에 대한 종속성으로 추가하고 등록에 명시 적으로 추가하거나 사용자 지정 규칙을 사용할 필요가 없습니다.

public class MyRepository : IRepository 
{ 
    private readonly string connectionString; 

    public MyRepository(IConfigurationSettingsReader settingsReader) 
    { 
     this.connectionString = settingsReader.ReadConnectionString("ConnStrName"); 
    } 
} 

설치 볼레 플레이트를 없애기 위해 각 저장소에서 상속 할 추상 기본 저장소 클래스를 만드는 것이 좋습니다.

희망이 도움이됩니다.