프리젠터 인스턴스 생성에 책임이있는 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...
}
}
:
및 Pacane의 대답 @
, 나는이 길을 갈 것이라고 생각 PresenterFactorypublic 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
이 필요합니다. 사용자가 요청한 기능에 따라 응용 프로그램이 인스턴스화 할 수 있도록 생성자를 통해 주입해야합니다.
무엇이 누락 되었습니까?
난 몰라 의존성 인젝터를 사용하고 있는지 알고 있지만 개인적으로 Ninject를 사용하여 공장을 생성하는 확장 기능을 사용합니다. https://github.com/ninject/ninject.extensions.factory/wiki/Factory-interface – Pacane
Ninject를 가르쳐 주셔서 감사합니다. 나는 이미 과거에 그것을 사용했다. 나는 당신의 몫보다 먼저 그것을 생각하지 않았습니다. –