2013-03-25 18 views
1

의해 주입 제한 I는 다음과 같은 구성을 가지고네임 스페이스

For<ITranslatorProvider>().Singleton().Use<TranslatorProviderA>(); 

I 3 역자 제공자 가지고 TranslatorProviderA, B 및 C.

특정 네임 스페이스에서 사용되어야 하나씩.

Project.Services>를 사용하여 제공

Project.Site> 사용자 제공자 B

은 ...

나는, B 또는 C되는 요청이 온 제공자 A를 네임 스페이스 따라 주입 할 수 있습니까?

이것이 가능합니까?

답변

1

당신은 a convention를 사용 할 수 있어야합니다. 이런 식으로 뭔가 작동한다고 :

using System; 
using System.Linq; 
using StructureMap.Configuration.DSL; 
using StructureMap.Graph; 
using StructureMap.TypeRules; 

class TranslationConvention : IRegistrationConvention 
{ 
    public void Process(Type type, Registry registry) 
    { 
     if(!type.IsConcrete()) 
      return; 
     var ctor = Constructor.GetGreediestConstructor(type); 
     var translatorParameters= ctor.GetParameters() 
      .Where(p => typeof(ITranslatorProvider) 
      .IsAssignableFrom(p.ParameterType)); 
     if(!translatorParameters.Any()) 
      return; 
     Type translatorType = GetTranslatorType(type); 
     translationParameters.Aggregate(registry.For(type).Use(type), 
      (current, parameter) => 
       current.CtorDependency<ITranslatorProvider>(parameter.Name) 
       .IsConcreteType(translatorType)); 
    } 

    Type GetTranslatorType(Type type) 
    { 
     if(type.Namespace == "Project.Services") 
      return typeof(TranslatorProviderA); 
     if(type.Namespace == "Project.Site") 
      return typeof(TranslatorProviderB); 
     return typeof(TranslatorProviderC); 

    } 
} 

만이 규칙은이 부분을 변경해야 할 몇 가지 인터페이스 클래스를 바인딩 당신이 원한다면, 그래서 구체적인 유형을 등록하는 작업 위의 규칙 : registry.For(type).Use(type)을 더 피팅 무언가로. Structure Map에서 built in conventions을보고 아이디어를 얻으십시오.

당신은 검사의 규칙을 사용할 수 있습니다

ObjectFactory.Initialize(c => c.Scan(s =>  
    { 
     s.TheCallingAssembly(); 
     s.Convention<TranslationConvention>(); 
    }) 
); 
0

네임 스페이스를 기반으로 공급자를 삽입 할 수 있다고 생각하지 않습니다. 하지만 당신은 명명 된 인스턴스를 사용하여 같은 일을 (나는 당신의 구현을 이해한다면) 얻을 수 있습니다

For<ITranslatorProvider>().Add<TranslatorProviderA>().Named("NS1"); 
For<ITranslatorProvider>().Add<TranslatorProviderB>().Named("NS2"); 

후 사용

container.GetInstance<ITranslatorProvider>("NS1"); 
관련 문제