2014-12-08 8 views
0

내 주요 프로젝트의 구체적인 형식 라이브러리를 참조하지 않도록하기 위해 노력하고있어,하지만 난이 오류 받고 있어요에 대한 명명 된 인스턴스 '기본'나는했습니다없음 기본 인스턴스하거나 요청 플러그인 타입

No default instance or named instance 'Default' for requested plugin type StackExchangeChatInterfaces.IClient 
1.) Container.GetInstance(StackExchangeChatInterfaces.IClient ,{username=; password=; defaultRoomUrl=; System.Action`2[System.Object,System.Object]=System.Action`2[System.Object,System.Object]}) 

을 내 컨테이너 설정이과 같이, 어셈블리를 검색하도록 :

 var container = new Container(x => 
     { 
      x.Scan(scan => 
      { 
       scan.AssembliesFromApplicationBaseDirectory(); 
       scan.ExcludeNamespace("StructureMap"); 
       scan.WithDefaultConventions(); 
       scan.AddAllTypesOf<IMessageHandlers>(); 
      }); 
      //x.For<IClient>().Use<Client>(); //GetInstance will work if this line is not commented out. 
     }); 

내가 인스턴스를 얻을 할 때 나는 오류, 인스턴스를 얻기를위한 내 코드는 여기에 있습니다 :

chatInterface = container 
    .With("username").EqualTo(username) 
    .With("password").EqualTo(password) 
    .With("defaultRoomUrl").EqualTo(roomUrl) 
    .With<Action<object, object>>(delegate(object sender, object messageWrapper) 
     { 
      string message = ((dynamic)messageWrapper).Message; 
      Console.WriteLine(""); 
      Console.WriteLine(message); 
      foreach (var item in messageHandlers) 
      { 
       item.MessageHandler.Invoke(message, chatInterface); 
      }       
     }).GetInstance<IClient>(); 

구체적인 클래스를 인터페이스에 명시 적으로 매핑하면 모든 것이 늠름한 dory로 작동하지만 이는 내가 수행하고 싶지 않은 Client이있는 프로젝트를 참조해야한다는 것을 의미합니다.

답변

2

이것은 정말 흥미 롭습니다. 기본 컨벤션은 그러한 생성자로 타입을 등록 할 수없는 것처럼 보입니다 (2.6.3과 3+ 버전에서 모두 시도되었습니다). 매개 변수가없는 생성자 만 지정된 경우에만 등록되었습니다. 두 버전의 출처를 살펴보면 등록해야 할 때 정말 의심 스럽습니다.

public class ClientConvention : IRegistrationConvention 
{ 
    public void Process(Type type, Registry registry) 
    { 
     if (type.IsClass && !type.IsAbstract && !type.IsGenericType && 
      type.GetInterfaces().Contains(typeof(IClient))) 
     { 
      registry.For(typeof(IClient)).Use(type); 
     } 
    } 
} 

구성을 다음과 같이 :

var container = new Container(
      c => c.Scan(
       s => 
        { 
         s.ExcludeNamespace("StructureMap"); 
         s.WithDefaultConventions(); 
         s.Convention<ClientConvention>(); 
         s.AddAllTypesOf<IMessageHandlers>(); 
        })); 

및이 잘 작동해야 코드로 깊은 다이빙은

어쨌든 사용자 등록 규칙을 사용하려고 ... 필요하다.

+0

나는 오늘 저녁에 집에 갈 때 이것을 시험해 볼 것이다. –

+0

이 기능이 추가 되었다면, registry.For (typeof (IClient)) 다음에 'ClientConvention.Process'에 생성자 인수를 설정하는 것뿐입니다.이 질문과 같이 사용하십시오 : http : // stackoverflow .com/questions/5698274/structuremap-constructor-arguments –

+0

* IClient *를 해결하는이 방법이 효과가 없다고 말하는 것입니까? = 용기 .With ("이름"). EqualTo가 (사용자 이름) .With ("비밀번호"). EqualTo가 (암호) .With ("defaultRoomUrl"). EqualTo가 (roomUrl) .With <액션 > (대리인 (개체 발신자, 개체 messageWrapper) { // ... }). GetInstance (); – LetMeCodeThis

0

기본 유형 검색은 생성자 함수에 문자열, 숫자 또는 날짜와 같은 원시 인수가 포함 된 구체적인 유형을 선택하지 않습니다. 생각해 보면 어쨌든 인라인 종속성을 명시 적으로 명시 적으로 구성해야한다는 것입니다.

"그렇지만 클라이언트가있는 프로젝트를 참조해야한다는 것을 의미합니다. 원하지 않는 프로젝트입니다."

  • 실제로 중요한가요? 어셈블리 참조를 제거하려고 시도 할 때보 다 더 힘들게 만들고 있다고 생각합니다.
+0

추론이 이치에 맞습니다. 명확히 해 주셔서 감사합니다. – LetMeCodeThis