如何在Winform中使用Unity的DI
本文关键字:Unity DI Winform | 更新日期: 2023-09-27 18:21:06
我让Unity DI容器最初用于我的Windows窗体应用程序。运行程序时,Microsoft.Practices.Unity.dll中出现类型为"System.StackOverflowException"的未经处理的异常。此代码中的错误是什么?如何修复?
public static class Program
{
private static void Main()
{
var container = BuildUnityContainer();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(container.Resolve<Form1>());
}
public static IUnityContainer BuildUnityContainer()
{
var currentContainer = new UnityContainer() ;
currentContainer.RegisterType<IUserViewPresenter, UserViewPresenter>();
currentContainer.RegisterType<IUserView, Form1>();
return currentContainer;
}
}
public partial class Form1 : Form, IUserView
{
private readonly IUserViewPresenter _presenter;
public Form1(IUserViewPresenter presenter)
{
_presenter = presenter;
InitializeComponent();
}
public string FirstName
{
get { return firstName.Text; }
set { firstName.Text = value; }
}
public string LastName
{
get { return lastName.Text; }
set { lastName.Text = value; }
}
}
public interface IUserView
{
string FirstName { set; get; }
string LastName { set; get; }
}
public class UserViewPresenter : IUserViewPresenter
{
readonly IUserView _view;
public UserViewPresenter(IUserView view)
{
_view = view;
}
public void Save()
{
_view.FirstName = "Arman";
_view.LastName = "Arian";
}
}
public interface IUserViewPresenter
{
void Save();
}
您有一个无限递归循环。
- 您称之为容器。Resolve()
- Unity检查Form1构造函数,并看到需要构造的IUserView的实例
- Unity检查UserViewPresenter并看到需要构建的Form1实例
- 转到2
- StackOverflow
如果你能去掉你的循环引用,你的问题就会得到解决。还有我的推荐。
-或-
您可以向PerResolveLifetimeManager注册每个。然后,每次调用resolve时,它只会构造每种类型中的一种。
currentContainer.RegisterType<IUserViewPresenter, UserViewPresenter>(new PerResolveLifetimeManager());
currentContainer.RegisterType<IUserView, Form1>(new PerResolveLifetimeManager());
为了解决问题:
private static void Main()
{
var container = BuildUnityContainer();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
不过我不建议你那样做。。。
对于你的情况,我推荐很多这个链接:这里
如果你有兴趣在WPF环境中进行:
看看PRISM模式
引导程序特别是