2014-03-27 1 views
0

프리젠터 인스턴스 생성에 책임이있는 PresenterFactory를 만들고 싶습니다. 이 질문에 제공된 코드 샘플을 기반으로Generics에서 Factory 패턴을 사용하는 방법은 무엇입니까?

:

PresenterFactoryTests

[TestClass] 
public class PresenterFactoryTests { 
    [TestClass] 
    public class Instance : PresenterFactoryTests { 
     [TestMethod] 
     public void ReturnsInstantialized() {     
      // arrange 
      Type expected = typeof(PresenterFactory); 

      // act 
      PresenterFactory actual = PresenterFactory.Instance; 

      // assert 
      Assert.IsNotNull(actual); 
      Assert.IsInstanceOfType(actual, expected); 
     } 

     [TestMethod] 
     public void ReturnsSame() { 
      // arrange 
      PresenterFactory expected = PresenterFactory.Instance; 

      // act 
      PresenterFactory actual = PresenterFactory.Instance; 

      // assert 
      Assert.AreSame(expected, actual); 
     } 
    } 

    [TestClass] 
    public class Create : PresenterFactoryTests { 
     [TestMethod] 
     public void ReturnsAuthenticationPresenter { 
      // arrange 
      Type expected = typeof(IAuthenticationPresenter); 

      // act 
      IAuthenticationPresenter actual = 
       PresenterFactory 
        .Instance 
        .Create<IAuthenticationPresenter, IAuthenticationView>(
         new MembershipService()); 

      // assert 
      Assert.IsInstanceOfType(actual, expected); 
     } 

     // Other tests here... 
    } 
} 

:

How to Moq this view?

및 Pacane의 대답 @

, 나는이 길을 갈 것이라고 생각 PresenterFactory

public sealed PresenterFactory { 
    private PresenterFactory() { } 

    public static PresenterFactory Instance { get { return getInstance(); } } 

    P Create<P, V>(params object[] args) where P : IPresenter<V> where V : IView { 
     V view = (V)Activator.CreateInstance<V>(); 
     return Activator.CreateInstance(typeof(P), view, args); 
    } 

    private static PresenterFactory getInstance() { 
     if (instance == null) instance = new PresenterFactory(); 
     return instance; 
    } 

    private static PersenterFactory instance; 
} 

ApplicationPresenter는

public class ApplicationPresenter : Presenter<IApplicationView>, IApplicationPresenter { 
    public ApplicationPresenter(IApplicationView view, PresenterFactory presenters) 
     : base (view) { 
     Presenters = presenters; 

     // other initializing stuff here... 
    }  
} 

그러나, 유형 제약, 언급 위 - 테스트에 명시된대로 난 그렇게 할 수없는 나는 것 같다.

PresenterFactoryTests.Create.ReturnsAuthenticationPresenter 테스트 메소드에서 인터페이스를 유형 매개 변수로 사용하면 Activator.CreateInstance이 인터페이스의 인스턴스를 만들 수 없기 때문에 유형 매개 변수로 인터페이스를 컴파일하고 런타임에 throw합니다.

이외에도 구체적인 유형을 입력하면 명시 적으로 형식을 내 형식 제약 조건으로 변환 할 수 없다는 오류가 발생합니다. 둘 다 주어진 인터페이스를 구현합니다.

ApplicationPresenter에 의해 PresenterFactory이 필요합니다. 사용자가 요청한 기능에 따라 응용 프로그램이 인스턴스화 할 수 있도록 생성자를 통해 주입해야합니다.

무엇이 누락 되었습니까?

+1

난 몰라 의존성 인젝터를 사용하고 있는지 알고 있지만 개인적으로 Ninject를 사용하여 공장을 생성하는 확장 기능을 사용합니다. https://github.com/ninject/ninject.extensions.factory/wiki/Factory-interface – Pacane

+0

Ninject를 가르쳐 주셔서 감사합니다. 나는 이미 과거에 그것을 사용했다. 나는 당신의 몫보다 먼저 그것을 생각하지 않았습니다. –

답변

2

난 당신이 하나 개 더 일반적인 인수를 필요가 있다고 생각 -보기의 구체적인 유형을 당신이 볼의 인터페이스 유형 (을 만들 수 있도록보기 및 발표자)이 개 구체적인 유형을 필요로하기 때문에 :

P Create<P, V, IV>(params object[] args) 
     where P : IPresenter<V> where V :IV, IV: IView { 
+0

+1 깔끔한 해결책을 제시합니다. 때로는 더 간단한 해결책이 우리가 가장 덜 생각하는 것입니다. = P 나는 사용의 용이성에 대해 우려하고있다. 필자는 개인적으로 여러 유형의 인수를 제공하는 것이 공장 작동 방식을 알지 못하는 사람을 위해 코드를 재사용하기에 충분히 쉽다고 생각하기 때문에 등록에 대한 내 생각은 IMHO를 사용하는 것보다 복잡합니다. 나는 프로그래머가 여러 타입 매개 변수를 사용하고'args' 객체 배열에 올바른 인수를 제공하는 것이 더 가치 있고 자연 스럽다는 것을 알게되었습니다. 주제에 대한 당신의 생각은 어떻습니까? –

+0

@WillMarcouiller - 객체 생성을 위해 DI 컨테이너를 주석에 언급 된대로 사용합니다. 팩토리에이 코드를 사용하면 코드에서 유형을 숨기는 데 시간을 소비하지 않으려합니다. 사용법이 코드의 아주 작은 부분에만 국한되며 "종속성 설정"코드는 이미 많은 "마법"을 가지고있는 경향이 있기 때문입니다. 다른 용도 - 컴파일러에서 형식을 자동으로 감지 할 수없는 경우 다른 솔루션을 찾으려고합니다. –

+0

@WillMarcouiller 참고 : 더 나은 솔루션이 있는지 확인하기 위해 http://CodeReview.stackexchange.com에 게시하려고 할 수 있습니다.나는 개인적으로 당신의 방법이 어떻게 논쟁에서 일어날 것인가에 대한 힌트를주지 않는 것을 좋아하지 않는다. (그들은 하나의/양쪽/어떤 타입의 생성자에 전달 될 것이고, 어떤 마법 같은 일이 일어날 것인가 ...). 아마도 유동성 인터페이스가 더 잘 작동 할 것입니다.''.ViewParm (viewConstructorArgs) .PresenterParm (args) .Build()' –

관련 문제