Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在MVVM中解析Prism服务_C#_Mvvm_Prism_Unity Container - Fatal编程技术网

C# 在MVVM中解析Prism服务

C# 在MVVM中解析Prism服务,c#,mvvm,prism,unity-container,C#,Mvvm,Prism,Unity Container,试图解析容器中的存储服务对象(主要作为单例接口) 有一个域模块,它是视图模型将使用服务模块的服务 您建议在哪里以及如何解决此问题,在域模块的域模块内或域模块的视图模型内进行解析 如果我可以在ViewModel的构造函数中执行此操作,那么在注册服务后,下面的代码是否足够,如果我不想执行此操作,该怎么办: public DetailsViewModel(IWService wSvc,) { wService = wSvc; } 在“视图模型”中获取服务对象(

试图解析容器中的存储服务对象(主要作为单例接口)

有一个域模块,它是视图模型将使用服务模块的服务

您建议在哪里以及如何解决此问题,在域模块的域模块内或域模块的视图模型内进行解析

如果我可以在ViewModel的构造函数中执行此操作,那么在注册服务后,下面的代码是否足够,如果我不想执行此操作,该怎么办:

    public DetailsViewModel(IWService wSvc,)
    {
        wService = wSvc;
    }
在“视图模型”中获取服务对象(存储在容器中)的最佳方法是什么

我在这里提供的只是一个样本。
感谢您的帮助

我建议您的ViewModels通过构造函数的依赖项注入获得它们使用的服务。无论您决定采用何种方法,都应该记住,其中一个主要概念是测试ViewModels的能力。通常,这需要能够为ViewModels提供服务的模拟实现,以独立于这些服务测试它们的行为。如果使用构造函数注入,您可以简单地创建模拟服务,然后将它们传递到ViewModel的构造函数中进行测试(如果您要编写单元测试)。即使此时您不打算编写单元测试,我认为这也是养成遵循特定设计方案的习惯的一个有效原因

public class SomeViewModel
{
    private IEventAggregator events;
    private ISomeService someService;

    public SomeViewModel(IEventAggregator events, ISomeService someService)
    {
        this.events = events;
        this.someService = someService;
    }
}

我建议您的ViewModels通过构造函数的依赖项注入获得它们使用的服务。无论您决定采用何种方法,都应该记住,其中一个主要概念是测试ViewModels的能力。通常,这需要能够为ViewModels提供服务的模拟实现,以独立于这些服务测试它们的行为。如果使用构造函数注入,您可以简单地创建模拟服务,然后将它们传递到ViewModel的构造函数中进行测试(如果您要编写单元测试)。即使此时您不打算编写单元测试,我认为这也是养成遵循特定设计方案的习惯的一个有效原因

public class SomeViewModel
{
    private IEventAggregator events;
    private ISomeService someService;

    public SomeViewModel(IEventAggregator events, ISomeService someService)
    {
        this.events = events;
        this.someService = someService;
    }
}

只要您的视图模型(DetailsViewModel)由unity容器解析,上面的代码就应该为您提供视图模型中的服务。您得到的是我看到的创建Prism应用程序的标准方式。如果您的视图模型不是由容器创建的,您需要自己将服务传递到视图模型的构造函数中。我刚刚使用Prism编写了一个应用程序,我基本上放弃了MVVM,转而采用更像MVP的方法,因为我发现没有presenter或controller类的VM(视图模型)的整个概念非常混乱。@Jay谢谢你提供的信息,很抱歉当时我不在PC机上,我仍在处理它,并试图理解和利用一些较暗的部分,不知何故我喜欢它,我的代码缺少一些片段,我正在尝试修复它们。:)只要您的视图模型(DetailsViewModel)由unity容器解析,上面的代码就应该为您提供视图模型中的服务。您得到的是我看到的创建Prism应用程序的标准方式。如果您的视图模型不是由容器创建的,您需要自己将服务传递到视图模型的构造函数中。我刚刚使用Prism编写了一个应用程序,我基本上放弃了MVVM,转而采用更像MVP的方法,因为我发现没有presenter或controller类的VM(视图模型)的整个概念非常混乱。@Jay谢谢你提供的信息,很抱歉当时我不在PC机上,我仍在处理它,并试图理解和利用一些较暗的部分,不知何故我喜欢它,我的代码缺少一些片段,我正在尝试修复它们。:)我的观点与您提供的相同,但有一个简单的问题:我没有获取服务,而是尝试通过构造函数获取IUnityContainer,然后调用后来定义的FetchServices方法,我在那里定义了我的服务,可以吗?或者在这种情况下,是否建议将容器设置为单例?@lastbeye不,您刚才描述的不是一个好主意。您基本上是在创建一个单例或服务位置样式的模式,这在某种程度上首先否定了依赖注入的目的。您可能想查找“Composition Root”,虽然我不完全同意它,但它解释了为什么您不想做您刚刚做的事情mentioned@LastBye简而言之,尝试将容器的使用限制在每个模块的入口点。我会将IUnityContainer注入到IModule的(实现)构造函数中。然后,注册您的类型并在Initialize方法中解析其组件,至少对于Unity是这样。通常,您解析的其他类型或被注入其他类型的其他类型应该能够将其依赖项注入构造函数。+1s,明白您的意思了,将FetchServices与构造函数分离(但不包括singleton容器,也可以从构造函数中调用它)怎么样?这可能对更快的类生成和分类有所帮助。(我想法的第一部分)你把它和构造函数分开是什么意思?快速生成和分类是什么意思?我会避免直接在视图模型中使用ServiceLocator或容器。我还避免使用DependencyAttribute([Dependency])进行属性注入,因为构造函数在手动创建类时会显示类具有明确的依赖关系。但是,您可以使用构造函数重载,例如,如果您想要传递更多或更少可选依赖项的选项。ctor参数还有一个[可选]属性。(然后检查null)我的观点与您提供的相同,但有一个简单的问题:我没有得到我试图得到的服务