0

일반적으로 생성자 삽입을 사용하고 컨테이너를 클래스에 삽입하는 것을 피하기 위해 종속성 삽입 프레임 워크를 사용합니다. 그러나 메시지 프로세서의 여러 인스턴스 (처리 스레드 당 하나씩)를 만들어야하므로 생성자 주입을 사용하여 해당 프로세서를 인스턴스화 할 수 없습니다.유니티 프레임 워크를 사용하여 클래스의 여러 인스턴스를 인스턴스화하는 최적의 디자인 패턴

물론 컨테이너를 주입하고이를 사용하여 프로세서를 해결할 수 있지만 많은 사람들이 안티 패턴이라고합니다. 나는 대안으로 공장을 만들고, 공장을 해결하고, 그것을 사용하여 프로세서를 만들 수있다. 그러나 타입을 올바르게 생성하기 위해 매개 변수가 필요하지 않더라도 주입하고자하는 각 유형에 대해 별도의 팩토리를 가져야하는 것은 많은 오버 헤드처럼 보입니다. 그래서 대신 컨테이너를 삽입하는 경향이 있습니다. .. 다른 사람들이이 시나리오를 다루는 가장 좋은 방법에 대한 생각을 갖고 있습니까?

많은 도움을 주셔서 감사합니다.

+0

'Func '를 삽입하려고 했습니까? Unity는'T'가 등록되면'Func '을 어떻게 삽입하는지 알고 있습니다. 각 스레드마다 메시지 프로세서를 만드는 방법을 보여주는 코드를 제공 할 수 있습니까? –

+0

감사합니다. 이것은 나를 위해 일하고 있는데, 사용자 정의 팩토리 클래스를 선언 할 필요없이 IMessageProcessor를 생성하는 팩토리를 생성합니다! 불행히도, 이것이 의견으로 입력 되었기 때문에 나는 그것을 해결책으로 표시 할 수 있다고 생각하지 않지만, 이것이 나의 문제를 해결했습니다. – user756366

답변

0

당신이 말하는 반 패턴은 Service Locator입니다. 컨테이너에 대한 종속성이 서비스 위치의 형태인지 여부는 사용 위치에 따라 다릅니다. 이는 Service Locator가 약 the role, not about the mechanics이기 때문입니다. 따라서 Composition Root 안에있는 모든 코드에 컨테이너를 자유롭게 사용할 수 있습니다. 그것은 즉시 당신을 위해 인스턴스를 만들 컨테이너를 사용하는 미세하지만

, 그것은 일반적으로하기 때문에, 구성 요소를 만들 bad to have application-accessible factory abstractions입니다 :

서비스 추상화가 자신의 정의에 다른 서비스 추상화를 노출하지 않아야

대신에 이러한 메시지 처리기를 즉시 작성해야하는 경우 이는 소비자의 관심사가 아닙니다. 여분의 추상화를 작성하면 코드가 복잡해질뿐입니다. 따라서 런타임시 컨테이너로 다시 호출하여 메시지 프로세서 구현을 임시로 생성하는 메시지 프로세서 (Composition Root에서 정의 됨) 용 프록시 구현을 만들고 싶습니다. 이 프록시를 실제 메시지 프로세서 대신 소비자에게 주입하면 프록시와 실제 프로세서가 동일한 인터페이스를 구현하므로 소비자는 이에 대해 알지 못합니다.

+0

답변 해 주셔서 감사합니다. 제안과 관련하여 약간 혼란 스럽습니다. 컴포지션 루트에서 프록시 클래스를 선언한다는 것은 내 메시지 처리기 클래스를 대신 할 수있는 방법을 알지만, 필요한 다중 인스턴스를 만드는 데 어떻게 도움이 될까요? 위의 주석에서 Func 형식을 사용하면 수동으로 선언 할 필요없이 즉석에서 필요한 팩토리를 만들 수 있습니다. 좋은 해결책이 아닌 이유가 있습니까? 많은 감사합니다! – user756366

+0

@ user756366 Func 을 사용하는 데는 아무런 문제가 없지만 위에서 설명한 이유와 참조 된 기사 때문에이 Func를 응용 프로그램 구성 요소에 직접 삽입하면 안됩니다. 대신이 Func을 프록시 구현 뒤에 숨겨야합니다. 많은 프록시 구현을 생성해야하는 경우 코드 기반에 공통적 인 추상화가 없습니다. – Steven

+0

감사! 이해하기 시작했을 수도 있습니다 ... 당신은 소비자가 볼 수있는 DTO (또는 Command)를 사용하여 여러 IMessageProcessors 대신 소비자에게 하나의 MessageProcessingController를 노출해야한다고 말한 것 같습니다. 컨트롤러는 내부적으로 IMessageProcessors를 생성 할 수 있습니다.IMessageProcessor 로직을 컨트롤러로 실제로 옮길 수 있기 때문에이 문제가 해결됩니다. 그러나 콘트롤러에 콘테이너가 여전히 필요하다면 콘트롤러가 어떻게 구성되는지 아직도 혼란 스럽습니다 - 유니티를 우회하여 수동으로 콘트롤러를 인스턴스화하라는 말입니까? – user756366

관련 문제