2012-07-29 3 views
2

다음은다음에 입력 된 팩토리를 사용하고 매개 변수를 생성자에 전달하는 것입니다. 코드에 표시된대로 2 개의 매개 변수 (1, "fo")를 전달하려고하면 형식화 된 팩토리에서이 오류가 발생합니다.Castle Windsor Typed Factory에 매개 변수 전달하기

enter image description here

public class SomeClass { 
    public ITypedFactory2 F2 { get; set; } 
    public void SomeFunction() { 
     var req = F2.Create<IGetFooRequest>(1, "fo"); // ERROR HERE 
    } 
} 
public class GetFooRequest : IGetFooRequest { 
    public int Bar { get; private set; } 
    public string Ton { get; private set; } 
    public GetFooRequest(int bar, string ton) { 
     Bar = bar; 
     Ton = ton; 
    } 
} 
public interface IGetFooRequest{ 
    int Bar { get; } 
    string Ton { get; } 
}  
public interface ITypedFactory2 { 
    T Create<T>(int param1, string param2); 
    void Release(object t); 
} 

이는 윈저 설치 부분입니다 ...

container.AddFacility<TypedFactoryFacility>(); 
container.Register(Component.For<ITypedFactory2>().AsFactory()); 
container.Register(AllTypes 
      .FromAssemblyContaining<IGetFooRequest>() 
      .Where(type => type.Name.EndsWith("Request")) 
      .WithService.AllInterfaces().LifestyleTransient()); 

가 왜 비 선택적인 종속성을 확인할 수 없습니다 말한다 ...? 나는 안으로 통과했다 (1, "fo"); 왜 이런 일이 일어 났는지 이해가 안돼. 제발 도와주세요.

답변

7

나는 동일한 질문을했고 그 대답을 알아 냈다. 팩토리 메서드의 매개 변수 이름과 클래스 생성자의 매개 변수 이름이 일치해야하며 대/소문자를 구분하지 않습니다.

그렇게

public class GetFooRequest : IGetFooRequest { 
    public int Bar { get; private set; } 
    public string Ton { get; private set; } 
    public GetFooRequest(int **param1**, string **param2**) { 
     Bar = bar; 
     Ton = ton; 
    } 
} 
+0

답변으로 표시되지 않는 이유는 무엇입니까? – neverseenjack

+0

답변으로 표시됨 –

2

내 자신의 코드를보고 (int param1, string param2) 잘 보이지 않는다고합니다. 내가 사용하자 (int bar, string ton) ... 그리고 그 명명 문제가 해결되었습니다. LoL Unbelievable, 그리고 나는 그 문서가 명명의 중요성을 언급하는 것을 보지 못했다.

운 좋게도 intro here은 종속성이 이름으로, 그런 다음 유형별로 해결되었다고합니다. 그래서 이름 부분이 그 일을하고, 유형 부분은 물 안으로 들어가게됩니다. 어쨌든, 나는 그것을 사용하는 방법을 알아 냈기 때문에 기쁘다. 그래서 나는 그것을 필요로하는 사람과 나의 대답을 나눈다.

+0

이 응답은 기본적으로 이전의 대답을 반복에

public interface ITypedFactory2 { T Create<T>(int **bar**, string **ton**); void Release(object t); } 

또는 클래스에 공장 인터페이스를 변경합니다. Wabble에서 제공 한 응답은 여기에 답변으로 표시되어야합니다. – neverseenjack

+0

@neverseenjack 날짜를 살펴 봅니다. Wabble이이 문제를 조사하기 전에 1 년 내 자신의 질문에 대답했기 때문입니다. 어쨌든, 나는 그의 포스트를 대답으로 표시했다. – Tom

관련 문제