당사의 제품 중 하나는 다양한 소형 웹 응용 프로그램과 각각 다른 컴퓨터에 잠재적으로 존재하는 Windows 서비스, 구성 요소로 구성됩니다. 그 중 하나는 WebForms 프로젝트입니다.이 프로젝트는 다른 모든 구성 허브 역할을합니다.DI를 사용하여 동일한 인터페이스의 여러 구현을 전달
우리는 이제 구성 요소의 일반 정보를 공개하는 기능을 설계하고 있습니다. 예를 들어이 같은 간단한 인터페이스를 상상해
public interface IStatistics
{
Statistics GetStatistics();
}
우리는 모든 구성 요소에 동일한 인터페이스를 사용하려면, 그래서이 공통, 공유 어셈블리에 집중되어있다. 구현은 처음에는 동일하므로 인터페이스와 함께이 어셈블리에 있습니다.
다음은 공통 어셈블리에서 구현과 인터페이스를 모두 사용하여 각 구성 요소에 Wcf 서비스를 노출하는 것입니다. 구현은 로컬 시스템 시간과 같이 실행중인 위치에 따라 다른 결과를 반환하는 환경 클래스를 사용합니다.
내가 우아하게 해결하고자하는 문제는 같은 인터페이스를 사용하여 모든 구성 요소의 모든 구현을 webform에 전달하는 방법입니다.
우리는 현재 Unity을 사용하고 있지만 다른 DI 솔루션과 동일한 문제가 발생할 것이라고 생각합니다. 이 같은 인터페이스 (각 구성 요소마다 하나씩)를 5 개 구현하고 구성 요소별로 구별 할 수 있습니다 (Dictionary<Component, IStatistics>
, Component
은 Enum
). 이는 페이지에서 어떤 구성 요소의 정보가 표시 될지 선택하기위한 드롭 다운이있을 것이므로 페이지는 올바른 구현을 호출하여 결과를 검색하기 때문에 필요합니다.
모든 구현에 명명 된 등록을 사용할 수 있다는 것을 알고 있습니다.
- 은 각각
- 명시 적으로 용기 내 웹 양식을 등록 할 구성 요소
- 등록 다른 이름으로 컨테이너의 각 구현을 가리키는 페이지의 5 개 가지 매개 변수가 있습니다 : Unfortunatelly,이에 나를 이끌 것 맞춤 InjectionConstructor 페이지 주입법
대한 올바른 순서로 각각 등록 인터페이스를 지정하여 I 유니티가 ResolveAll 메소드가 알고 있고, 따라서 하나를 수신 할 수있는 IStatistics[]
또는,하지만 그때 나는 그들을 차별화 할 수 없을 것입니다.
저는 MEF이 메타 데이터 인터페이스의 개념을 훌륭하게 해결한다고 생각합니다. 아마도이 문제에 MEF를 사용하는 것이이 문제를 해결할 수있는 방법일까요? 나는 이것이 우리가 말하는 wcf 대리인이기 때문에 여기서는 부적절하다고 생각합니다. 이것이 MEF와 어떻게 통합 될지는 볼 수 없습니다.
아마도 공장을 사용하는 것이 더 나은 전략 일 수 있지만 공장에서 서비스를 주입하는 방법을 알 수 없으므로 문제가 지속될 수 있습니다.
네이밍이 문제라면'IStatistics' 구현체를'DisplayNameAttribute'로 꾸미는 것이 어떻습니까? 팩토리가 그 속성을 읽고'IEnumerable>'또는 비슷한 것을 반환하도록 할 수 있습니다. –
Steven
@Steven 제 질문에 필자는 구현이 실제로 전문화가 필요하지 않기 때문에 공통 어셈블리에 중앙 집중화되었다고 언급했음을 주목하십시오. 귀하의 접근 방식은 실제로 각 구성 요소에 여러 번 구현 한 경우에만 작동합니다. 현재로서는 이것이 의미가 없습니다. 통찰력을 가져 주셔서 감사합니다, 그렇지 않으면 아마 좋은 접근 방법 일 것입니다. – julealgon
@ julealgon, 얼마나 많은 IStatistics 프록시가 있고 드롭 다운 목록에 표시 이름이 무엇인지 알 수 있습니까? –