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
仅根据您在问题中提出的内容,我认为您可能错误地使用了控制反转容器:
-
您似乎是在显式地调用容器来解析ViewModel,我猜是在控制器操作内部。应用程序对容器的使用应该在很大程度上是透明的,因为在应用程序启动时设置了组合根。
-
使用容器来解析ViewModels似乎有点奇怪,因为ViewModels或多或少都是简单的数据传输对象,即POCO,用于在控制器和视图之间传输模型数据。因为它们是简单的POCO,所以它们可以很容易地构建,并且没有需要由容器满足的依赖关系,因此不需要由容器控制/解决。如果ViewModel依赖于操作的结果以便在视图中显示,则控制器应对此进行协调,并将结果分配给ViewModel。
如果你能在你努力实现的目标背后提供更多信息,我可能会提供进一步的帮助。