C# Win与Unity一起形成MVP。注入视图时出现问题

C# Win与Unity一起形成MVP。注入视图时出现问题,c#,winforms,dependency-injection,unity-container,mvp,C#,Winforms,Dependency Injection,Unity Container,Mvp,我正在编写一个WinForms应用程序,并使用某种类型的MVP模式 到目前为止,我有这样的想法: var mainPresenter = new MainPresenter(someusercontrol); public MainPresenter(MainView view) { var p = new MyPresenter(view.myView) } public MyPresenter(MyView view) { this.view = view;

我正在编写一个WinForms应用程序,并使用某种类型的MVP模式

到目前为止,我有这样的想法:

var mainPresenter = new MainPresenter(someusercontrol);

public MainPresenter(MainView view) 
{
      var p = new MyPresenter(view.myView)
}

public MyPresenter(MyView view) 
{
      this.view = view;

    //Some code here…
      var user = new UserService().GetUser(1);
      this.view.FirstName = user.FirstName;
      this.view.LastName = user.LastName;
}
我跳过了很多细节,但这是主要的想法,到目前为止效果很好。 请注意,“myView”是在设计时创建的用户控件

现在,我正在尝试添加Unity并注入所需的视图和服务,以便进行单元测试

我的代码如下所示:

var mainPresenter = new DependencyFactory.Container.Resolve<IMainPresenter>();

public MainPresenter(IMainView view, IMyPresenter myPresenter) 
{
}

public MyPresenter(IMyView view, IUserService userService) 
{
      this.view = view;

    //Some code here…
      var user = userService.GetUser(1);
      this.view.FirstName = user.FirstName;
      this.view.LastName = user.LastName;
}
我能够让unity创建/注入“MyPresenter”, 但问题是,正如预期的那样,它还创建了一个新的MyView Instance。因此,在MyPresenter中,在设计时创建的myView不是在屏幕上获取用户控件view.myView,而是获取一个新的myView实例,即Unity注入的实例

有没有人能给我一些建议,如何解决这个问题,或者如何正确处理


谢谢

我将查看Unity的终身管理文档。这里有一个很好的起始链接:

基本上,您需要准确地确定需要支持哪些场景,并确保使用正确的生命周期管理器。在本例中,您似乎希望Unity为MyPresenter创建一个MyView,然后将该视图传递给MainPresenter,在这种情况下,您需要PerResolveLifetimeManager。它将为每个要解析的调用启动一个实例

编辑:在下面添加示例

class Program
{
    static void Main(string[] args)
    {

        var container = new UnityContainer();

        container.RegisterType<IShared, Shared>(new PerResolveLifetimeManager());
        container.RegisterType<IChild, Child>();
        container.RegisterType<IParent, Parent>();

        var parent = container.Resolve<IParent>();

        var result = parent.Shared == parent.Child.Shared;

        Console.WriteLine("Result: {0}", result);
        Console.WriteLine("Parent Instance Count: {0}", parent.Shared.InstanceCount);
        Console.WriteLine("Child Instance Count: {0}", parent.Child.Shared.InstanceCount);
    }
}

public interface IShared {
    int InstanceCount {get;}
}

public interface IChild {
    IShared Shared {get;}
}

public interface IParent
{
    IChild Child {get;}
    IShared Shared { get; }
}

public class Child : IChild
{
    public Child(IShared shared)
    {
        Shared = shared;
    }

    public IShared Shared
    {
        get;
        private set;
    }
}

public class Shared : IShared
{
    private static int _instanceCount = 0;
    private int _myInstanceNumber = 0;

    public Shared()
    {
        _instanceCount++;
        _myInstanceNumber = _instanceCount;
    }


    public int InstanceCount
    {
        get { return _myInstanceNumber; }
    }
}

public class Parent : IParent
{
    public Parent(IChild child, IShared shared)
    {
        Child = child;
        Shared = shared;
    }

    public IChild Child { get; private set; }

    public IShared Shared { get; private set; }
}

谢谢你的回复。但问题是MyView正在被VisualStudio设计器实例化,我无法在MyPresenter中获得相同的对象来使用它。