【发布时间】:2016-05-03 04:39:11
【问题描述】:
背景
我正在使用带有 MVP 模式的 Winforms 来创建应用程序。我使用 SimpleInjector 作为我的 IoC 容器。我的演示者继承自:
public interface IPresenter<TView>
{
TView View { get; set; }
}
internal class HomePresenter : IPresenter<IHomeView>
{
public IHomeView View { get; set; }
...
}
为了创建演示者,我决定使用演示者工厂,方法如下:
public static IPresenter<TView> CreateForView<TView>(TView view)
{
var presenter = _container.GetInstance<IPresenter<TView>>();
presenter.View = view;
return presenter;
}
然后在每个视图中,视图通过调用演示者工厂创建自己的演示者:
_homeMainPresenter = (HomePresenter) presenterFactory.CreateForView<IHomeView>(this);
_homeMainPresenter.View = this;
在我的 Program.cs 文件中,我有:
static void Main()
{
System.Windows.Forms.Application.EnableVisualStyles();
System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false);
Bootstrap();
System.Windows.Forms.Application.Run((HomeView)container.GetInstance<IHomeView>());
}
private static void Bootstrap()
{
// Create the container
container = new Container();
// Register types
container.Register<IHomeView, HomeView>(Lifestyle.Singleton);
container.Register<IPresenter<IHomeView>, HomePresenter>();
...
// Verify the container
container.Verify();
}
问题
当从 HomeView 视图调用演示者工厂时,输入工厂的类型是 HomeView 类型,而不是 IHomeView。因此,应用程序会抛出异常,因为容器没有 HomeView 注册(只有 IHomeView)。我的演示者都有他们存储的视图引用的接口,因为我觉得这对于测试来说会更好。我该如何避免这种情况?
【问题讨论】:
标签: c# winforms generics simple-injector