I'm using FunQ from ServiceStackv3. I need resolve ViewModel
from Container for different object Ids.
Basically constructor parameter should distinguish between instances (I know it does not work that way, it's example):
var vm1 = EndpointHost.Container.Resolve<ViewModel, int>(1);
var vm2 = EndpointHost.Container.Resolve<ViewModel, int>(2);
and subsequent:
var vm3 = EndpointHost.Container.Resolve<ViewModel, int>(1);
Assert.Equal(vm1 == vm3)
I have try ReusedWithin
with no success.
I need two instances at the same time for presentation layer, user need to compare two objects on screen.
Is named instance only option? I's standalone application, with self hosted ServiceStack host.
Here is my console application:
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);
}
}
Edit
Application results:
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