我正在使用ServiceStackv3中的FunQ。我需要从Container解析ViewModel
以获取不同的对象ID。
基本上构造函数参数应区分实例(我知道它不起作用,例如):
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
答案 0 :(得分:1)
仅基于您在问题中提出的内容,我认为您可能错误地使用了Inversion of Control容器:
您似乎是明确调用容器来解析ViewModel,我猜是在控制器操作中。在应用程序启动时设置composition root,应用程序对容器的使用应该基本上是透明的。
使用容器来解析ViewModels看起来有点奇怪,因为ViewModel或多或少都是简单的数据传输对象,即POCO,用于在控制器和视图之间传输模型数据。因为它们是简单的POCO,所以它们可以容易地构造并且不具有容器所能满足的依赖性,因此不需要由容器控制/解决。如果ViewModel依赖于操作的结果以便在View中显示它,那么Controller应该协调它并将结果分配给ViewModel。
如果您可以提供更多有关您想要实现的信息,我可以提供进一步的帮助。