c# - 如何在Winform中使用Unity DI?

标签 c# winforms dependency-injection unity-container mvp

我的 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();
}

最佳答案

你有一个无限递归循环。

  1. 您调用container.Resolve()
  2. Unity 检查 Form1 构造函数并发现需要构造 IUserView 的实例。
  3. Unity 检查 UserViewPresenter 并发现需要构造 Form1 的实例。
  4. 转到 2。
  5. 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/

相关文章:

c# - 如何监听 ListView 中的滚动?

c# - 如何使用多个数据源运行单元测试?

.NET 数据 GridView : Remove "current row" black triangle

java - 接下来我应该学习什么 DI/IoC 框架?

dependency-injection - 如何注入(inject)注入(inject)器?

c# - 创建循环直到 true 或超时的等待任务

c# - 如何在 C# 中使用线程读取和解析非常大的平面文件?

c# - SqlDataAdapter 插入数据库不工作 C# winform

c# - 单击 TreeNode 时发生类型为 'System.NullReferenceException' 的未处理异常

eclipse - org.eclipse.e4.core.di.InjectionException : java. lang.NullPointerException