我的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();
}
答案 0 :(得分:4)
你有一个无限的递归循环。
如果您可以摆脱循环引用,您的问题将得到解决。我的建议。
-OR -
您可以使用PerResolveLifetimeManager注册每个。然后,每次调用resolve时,它只会构造每种类型中的一种。
currentContainer.RegisterType<IUserViewPresenter, UserViewPresenter>(new PerResolveLifetimeManager());
currentContainer.RegisterType<IUserView, Form1>(new PerResolveLifetimeManager());
答案 1 :(得分:0)
解决问题:
private static void Main()
{
var container = BuildUnityContainer();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
但我建议你不要这样做......
对于您的情况,我推荐了很多这个链接:Here
如果您有兴趣在WPF环境中这样做: