我想创建一个PresenterFactory将负责,很明显,为创建演示实例。如何在泛型中使用工厂模式?
基于对这个问题提供了代码示例:
和@ Pacane的回答,我以为我会走这条路:
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...
}
}
Presenter工厂
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
无法创建接口的实例。
除此之外,如果我输入的具体类型,它抱怨说,它不能明确地转换类型,我喜欢的类型的限制,虽然两者实现给定的接口。
ApplicationPresenter
需要PresenterFactory
,我将通过其构造函数注入它,以便应用程序可以实例化所有可用的演示者,具体取决于用户要求的功能。
我错过了什么?
我不知道你是否使用依赖注入器,但我个人使用Ninject的扩展为你生成工厂。 https://github.com/ninject/ninject.extensions.factory/wiki/Factory-interface – Pacane
感谢您指出我出去Ninject。我已经在过去使用过它。在你分享之前,我没有想到它。 –