【问题标题】:How to use DI by Unity in Winform?如何在 Winform 中使用 Unity 的 DI?
【发布时间】:2014-09-09 04:14:45
【问题描述】:

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

【问题讨论】:

  • 为什么不 Application.Run(container.Resolve());?
  • 更多信息请查看stacktrace...unity真的很难看到异常需要查看stacktrace...

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


【解决方案1】:

你有一个无限递归循环。

  1. 你调用 container.Resolve()
  2. Unity 检查 Form1 构造函数,发现需要构造 IUserView 的实例。
  3. Unity 检查 UserViewPresenter 并发现需要构造 Form1 的实例。
  4. 转到 2。
  5. 堆栈溢出

如果您可以摆脱循环引用,您的问题就会得到解决。还有我的建议。

-或-

您可以使用 PerResolveLifetimeManager 注册每个。然后每次调用resolve时它只会构造每种类型中的一种。

currentContainer.RegisterType<IUserViewPresenter, UserViewPresenter>(new PerResolveLifetimeManager());
currentContainer.RegisterType<IUserView, Form1>(new PerResolveLifetimeManager());

【讨论】:

  • 你能在我的上下文中给我 PerResolveLifetimeManager 的示例吗?
  • 用示例更新了答案。
【解决方案2】:

对于问题的解决:

private static void Main()
{
    var container = BuildUnityContainer();
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}

但是我不建议你这样做......

对于你的情况,我推荐了很多这个链接:Here

如果您有兴趣在 WPF 环境中执行此操作:

看看PRISM pattern

Bootstrap especifically

【讨论】:

  • 这不起作用,因为 Form1 没有无参数构造函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
  • 1970-01-01
相关资源
最近更新 更多