C# Win与Unity一起形成MVP。注入视图时出现问题
我正在编写一个WinForms应用程序,并使用某种类型的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;
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中获得相同的对象来使用它。