如何在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();
}

如何在Winform中使用Unity的DI

您有一个无限递归循环。

  1. 您称之为容器。Resolve()
  2. Unity检查Form1构造函数,并看到需要构造的IUserView的实例
  3. Unity检查UserViewPresenter并看到需要构建的Form1实例
  4. 转到2
  5. 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模式

引导程序特别是