0

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

1 回答 1

1

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

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

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

如果您可以提供更多关于您要实现的目标的信息,我可能会提供进一步的帮助。

于 2014-08-27T12:08:11.587 回答