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

时间:2014-08-27 11:52:07

标签: c# inversion-of-control funq

我正在使用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

1 个答案:

答案 0 :(得分:1)

仅基于您在问题中提出的内容,我认为您可能错误地使用了Inversion of Control容器:

  1. 您似乎是明确调用容器来解析ViewModel,我猜是在控制器操作中。在应用程序启动时设置composition root,应用程序对容器的使用应该基本上是透明的。

  2. 使用容器来解析ViewModels看起来有点奇怪,因为ViewModel或多或少都是简单的数据传输对象,即POCO,用于在控制器和视图之间传输模型数据。因为它们是简单的POCO,所以它们可以容易地构造并且不具有容器所能满足的依赖性,因此不需要由容器控制/解决。如果ViewModel依赖于操作的结果以便在View中显示它,那么Controller应该协调它并将结果分配给ViewModel。

  3. 如果您可以提供更多有关您想要实现的信息,我可以提供进一步的帮助。