如何在Winform中使用Unity?

时间:2014-09-09 04:14:45

标签: 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();
}

2 个答案:

答案 0 :(得分:4)

你有一个无限的递归循环。

  1. 您调用container.Resolve()
  2. Unity检查Form1构造函数,并看到需要构造一个IUserView实例。
  3. Unity检查UserViewPresenter并看到需要构建Form1的实例。
  4. 转到2。
  5. 的StackOverflow
  6. 如果您可以摆脱循环引用,您的问题将得到解决。我的建议。

    -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环境中这样做:

查看PRISM pattern

Bootstrap especifically