2012-05-23 3 views
3

리플렉션을 사용하여 구체 파생 형 인스턴스를 반환하기 위해 일반 추상 형식 매개 변수를 사용하는 팩터 리 메서드를 만드는 중입니다. 예를 들면.기본 클래스에서 파생 클래스를 인스턴스화하는 일반 팩터 리 메서드

public abstract class ServiceClientBase : IServiceClient 
{ 
} 

public abstract class Channel : ServiceClientBase 
{ 
} 

public class ChannelImpl : Channel 
{ 
} 

public class ServiceClientFactory 
{ 
    public T GetService<T>() where T : class, IServiceClient 
    { 
     // Use reflection to create the derived type instance 
     T instance = typeof(T).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(string) }, null).Invoke(new object[] { endPointUrl }) as T; 
    } 
} 

사용법 :

Channel channelService = factory.GetService<Channel>(); 

문제는 내가 파생 된 유형을 인스턴스화하는 팩토리 메소드에 대한 어떤 우아한 방법을 알아낼 수있는 방법의 추상 기본 유형을 전달되고 있다는 점이다. 필자가 생각해 낼 수있는 유일한 것은 추상베이스와 상응하는 파생 클래스 사이에 맵을 포함하고있는 Dictionary를 유지하는 것이지만 이것은 코드 냄새와 같은 것으로 보인다. 누구나 더 나은 솔루션을 제안 할 수 있습니까?

+0

글쎄, 당신이 추상 클래스의 두 가지 구체적인 구현을했다고 가정 해 - 그 결정을 어떻게 내리고 싶습니까? –

+0

그건 내 관심사 야. 필자의 경우 특정 구현이 하나만 있다는 것을 알고 있습니다. 하지만 여전히 문제를 해결할 더 우아한 방법을 찾고있었습니다. – koder

+0

WCF 프록시를 만들려고합니까? 휠을 다시 만들려고 노력 중이므로 전체 컨텍스트에 관심이 있습니다. – Bronumski

답변

4

하나의 구현 만 있고 동일한 어셈블리 내에 있다고 가정하면 리플렉션을 통해 찾을 수 있습니다. 예를 들어,

Type implementationType = typeof(T).Assembly.GetTypes() 
            .Where(t => t.IsSubclassOf(typeof(T)) 
            .Single(); 
return (T) Activator.CreateInstance(implementationType); 

성능상의 이유로 물론 추상 형식에서 구체적인 형식의 캐시가 필요할 수 있습니다.

구현 클래스가 여러 개인 경우 대안을 생각해 볼 필요가 있습니다. 하나의 옵션은 가능한 경우 구현 클래스를 나타내는 추상 클래스의 속성입니다. (문맥없이 좋은 옵션을주는 것은 어렵습니다.)

1

IOC 컨테이너를 재발견하려는 것 같습니다. 예를 들어 Autofac을 살펴보십시오. 콘크리트 유형을 IOC 컨테이너에 등록한 다음 인터페이스별로 요청할 수 있습니다.

+0

의 제네릭 형식 매개 변수를 사용하여 구체적인 클래스의 인스턴스를 만들 수있는 방법을 만들려고합니다. 실제로 볼 가치가있는 옵션 일 수 있습니다. 나는 단지 POC에서 일하고 있었다. 그래서 나는 대안을 찾기 쉽도록 알아 내려고 노력했습니다. 나는 확실히 의존성을 해결하기 위해 IOC를 사용할 것을 고려할 것이다. – koder

관련 문제