我的 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();
}
最佳答案
你有一个无限递归循环。
- 您调用container.Resolve()
- Unity 检查 Form1 构造函数并发现需要构造 IUserView 的实例。
- Unity 检查 UserViewPresenter 并发现需要构造 Form1 的实例。
- 转到 2。
- StackOverflow
如果您可以摆脱循环引用,您的问题就可以解决。还有我的建议。
-或-
您可以使用 PerResolveLifetimeManager 注册每个。然后,每次调用解析时,它只会构造每种类型之一。
currentContainer.RegisterType<IUserViewPresenter, UserViewPresenter>(new PerResolveLifetimeManager());
currentContainer.RegisterType<IUserView, Form1>(new PerResolveLifetimeManager());
关于c# - 如何在Winform中使用Unity DI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25736588/