C#IoC具有不同Id的同一ViewModel的许多实例

本文关键字:许多 实例 ViewModel Id C#IoC | 更新日期: 2023-09-27 18:19:31

我正在使用ServiceStackv3中的FunQ。我需要从Container中解析不同对象ID的ViewModel

基本上,构造函数参数应该在实例之间进行区分(我知道它不是这样工作的,这是一个例子):

var vm1 = EndpointHost.Container.Resolve<ViewModel, int>(1);
var vm2 = EndpointHost.Container.Resolve<ViewModel, int>(2);

及后续:

var vm3 = EndpointHost.Container.Resolve<ViewModel, int>(1);
Assert.Equal(vm1 == vm3)

我尝试过ReusedWithin,但没有成功。

我需要两个实例同时用于表示层,用户需要比较屏幕上的两个对象。

命名实例是唯一选项吗?我是一个独立的应用程序,具有自托管的ServiceStack主机。

这是我的控制台应用程序:

public class Program
{
    private static void Main(string[] args)
    {
        Console.WriteLine("Start");
        var appHost = new AppHost();
        var vm1 = EndpointHost.Container.Resolve<ViewModel, int>(1);
        Console.WriteLine("Id1=" + vm1.SomeSomeId + " Instances=" + ViewModel.Instances);
        var vm2 = EndpointHost.Container.Resolve<ViewModel, int>(2);
        Console.WriteLine("Id2=" + vm2.SomeSomeId + " Instances=" +     ViewModel.Instances);
        var vm3 = EndpointHost.Container.Resolve<ViewModel, int>(1);
        Console.WriteLine("Id3=" + vm3.SomeSomeId + " Instances=" + ViewModel.Instances);
        Console.WriteLine("Stop");
        Console.ReadKey();
    }
}
public class AppHost : AppHostHttpListenerBase
{
    public AppHost()
        : base("Test Service", typeof(Program).Assembly)
    {
        Init();
        Start("http://*:8082/");
    }
    public override void Configure(Container container)
    {
        container.Register<ViewModel, int>((c, i) => new ViewModel(i));
    }
}
public class ViewModel
{
    public static int Instances = 0;
    public int SomeSomeId { get; set; }
    public ViewModel(int someId)
    {
        SomeSomeId = someId;
        Interlocked.Increment(ref Instances);
    }
}

编辑

应用结果:

ReusedWithin(ReuseScope.Default, Container, Request) 
Id1=1 Instances=1 Id2=1 Instances=1 Id3=1 Instances=1
ReusedWithin(ReuseScope.None) 
Id1=1 Instances=1 Id2=2 Instances=2 Id3=1 Instances=3

C#IoC具有不同Id的同一ViewModel的许多实例

仅根据您在问题中提出的内容,我认为您可能错误地使用了控制反转容器:

  1. 您似乎是在显式地调用容器来解析ViewModel,我猜是在控制器操作内部。应用程序对容器的使用应该在很大程度上是透明的,因为在应用程序启动时设置了组合根。

  2. 使用容器来解析ViewModels似乎有点奇怪,因为ViewModels或多或少都是简单的数据传输对象,即POCO,用于在控制器和视图之间传输模型数据。因为它们是简单的POCO,所以它们可以很容易地构建,并且没有需要由容器满足的依赖关系,因此不需要由容器控制/解决。如果ViewModel依赖于操作的结果以便在视图中显示,则控制器应对此进行协调,并将结果分配给ViewModel。

如果你能在你努力实现的目标背后提供更多信息,我可能会提供进一步的帮助。