2011-03-23 3 views
3

디자인 패턴이 좋지만 문제는 구현하는 것이 지루할 수 있다는 것입니다. 예를 들어, 20 개 이상의 멤버가있는 객체를 꾸미는 것은 간단합니다.C# 속성 및 리플렉션을 사용하여 표시된 객체에 런타임에 바인딩을 삽입/강제 적용하는 방법은 무엇입니까?

그래서이 패턴의 구현을 훨씬 더 빠르고 단순하게 만들기 위해 (기본 클래스 또는 속성으로) 클래스에 적용 할 좋은 디자인 패턴 라이브러리를 만들고 싶습니다.

문제는 ... 어디서부터 시작해야하는지 잘 모르겠습니다. 왜냐하면 저는 속성과 반성에 거의 익숙하지 않기 때문입니다.


나는 (내보내기 태그 유사) 싱글 톤, Multitons 및 장식을 표시 ... 모든 가능한 특성을 활용하고 싶습니다. 하지만 인스턴스의 기능을 변경하는 싱글 톤 속성을 만들려면 어디서부터 시작해야할지조차 모릅니다.

나의 제한된 연구는 속성을 통한 반영/후기 바인딩을 사용하고 어셈블리에서 표시된 모든 클래스에 대한 액세스를 얻음으로써 싱글 톤을 해킹 할 수 있다고 믿게했습니다. 그러나 나는 아직 완전히 아닙니다. 그게 어떻게 될지.

Ninject 1.0이라는 프레임 워크는 Singleton 속성을 만들었지 만 라이브러리가 너무 광범위하고 문서화되지 않아 현재 논리를 따라갈 수 없습니다.


이런 종류의 기능을 갖춘 라이브러리가 많은 개발자에게 큰 공헌을 할 것이라고 생각합니다. 따라서 누군가가 이러한 패턴 중 하나를 속성으로 생성하기 위해 올바른 방향으로 향하게하는 샘플 코드를 제공 할 수 있다면 매우 감사 할 것입니다. 코드는 지나치게 복잡하지 않습니다. 아니면 누군가가 Ninject의 싱글 톤 속성 구현을 통해 나를 걸을 용의가 있기 때문에 내가 그 일을 할 수도 있습니다 ...

시간을 내 주셔서 감사합니다.

+1

이 코드의 샘플을 코드에서 작성해보십시오. 무관 한 점에서, 나는 조금 자신을 조금 모호하다. 디자인 패턴에 대한 이해를 하위 프레임 워크로 체계화하려는시기를 생각해 보면 근본적으로 시간 낭비였습니다. 일상 업무에서 훨씬 더 많은 가치가 있습니다. 그러나 어이, 그것을 위해 가라. 나는 실험을 결코 좌절시키지 않을 것입니다. 막연한 생각을 좀 더 구체적으로 만들 것을 권장하고 싶습니다. – harpo

+0

싱글 톤 속성이 실제로 작업량을 줄이는 지 모르겠지만 멋진 아이디어입니다. 데코레이터 패턴의 경우 리플렉션을 사용하여 모든 대상의 public 멤버를 복제 한 다음 더 많은 리플렉션으로 호출하거나 데코레이터에 액세스하려면 '동적'으로 데코레이터를 입력 할 수 있습니다. 문제는 Intellisense를 포함한 정적 타이핑의 모든 이점을 잃게된다는 것입니다. 타겟 클래스에 가치가있는 멤버가 너무 많으면 리팩터링해야 할 수도 있습니다. –

+1

아마도 Github에서 Ninject의 문서를 개선 할 수 있습니다. Ninject는 이미이를위한 훌륭한 프레임 워크를 제공합니다. 그렇다고해서 더 나은 휠을 만들 수 없다는 의미는 아닙니다. –

답변

4

디자인 패턴이 의미하는 바에 약간의 혼란이 있다고 생각합니다.

패턴은 실제로는 문제를 해결하기 위해 설계된 것입니다.입니다.

패턴을 위해 실제로 패턴을 사용하지 않습니다. 더 많은 패턴 사용이 자동으로 좋은 것을 의미하지는 않습니다. 패턴을 사용하여 유형의 문제을 해결할 수 있습니다.이 패턴은 문제를 해결하는 데 가장 잘 알려진 방법입니다. 이므로 코드에 패턴을 적용하지 마십시오.

자, 이제부터는 패턴을 구현하는 올바른 방법이 아니라는 것을 실제로 알 수 있습니다. 속성 등으로 코드를 표시하지 않고 패턴이라고 부릅니다. 패턴은 코드입니다. 귀하의 코드 은 패턴이입니다. 예를 들어 게시/구독 기능을 실제로 구현하지 않는 한 클래스에 게시자/구독자 패턴을 표시하지 않습니다. 예를 들어 클래스에 "Singleton"이라고 표시하지 않으면 싱글 톤 패턴이됩니다. 싱글 톤 패턴을 사용하려면 해당 디자인을 중심으로 프로그램 (및 클래스)을 코딩해야합니다.

당신 수 있지만, 코드/클래스가 특정 패턴과 일치하는지 여부 에서 지원을 확인 할 수 있습니다 특정 속성을 가진 마크 코드 또는 클래스.

예를 들어, 모든 클래스를 통과하는 유형 검사기를 구현하고 "게시자"로 표시된 것이 있는지 확인하고 해당 클래스가 "IPublisher"인터페이스를 구현하는지 확인하십시오. 또는 형식 검사기는 생성자가 한 번에 둘 이상의 인스턴스를 만들 수 있는지 여부에 관계없이 클래스가 "Singleton"으로 표시되는지 확인할 수 있습니다.

그러나 속성 및 반사는 일반적으로 의 도구가 아니며 패턴을 구현합니다.

다중 상속이없는 C#에서는 패턴을 구현하는 방법이 때로는 기본 클래스를 통해서만 이루어집니다. 예를 들어 "SingletonObject"패턴을 구현하여 하나의 인스턴스화로 제한되는 "SingletonObject"기본 클래스를 선언 할 수 있습니다. 그런 다음이 기본 클래스에서 싱글 톤이 될 클래스를 파생시킵니다. 예를 들어 IPublisher 및 ISubscriber 인터페이스를 선언하여 "게시/구독"패턴을 구현할 수 있습니다.

이제 C# 클래스의 데코레이터 패턴 (질문 제목대로)을 사용하려는 경우 자동 래퍼 객체 생성기를 찾고 있습니다. 래퍼를 ExpandoObject에 기반하여 기본 객체의 속성을 반복하고 기본 객체에 단순히 위임하는 ExpandoObject에 속성을 추가 할 수 있습니다. 그런 다음 기본 객체 위에 ExpandoObject에 새 속성을 추가합니다. 빌라! 자동 Decorator-Pattern 래퍼 클래스 생성기를 얻습니다.

관련 문제