gpt4 book ai didi

c# - 用枚举参数化对象

转载 作者:太空狗 更新时间:2023-10-30 01:25:55 24 4
gpt4 key购买 nike

我正在使用 C# 和 Unity 依赖注入(inject)在 WPF 中开发 MVVM 应用程序。我正在为以下问题寻找最干净的解决方案。

我的一些类是用枚举参数化的,例如,我有一个 AudioChannelViewModel 类(简称为 A),我想注册该类的两个实例,一个用于 Channel.Left,一个用于 Channel.Right .这本身不是问题,因为我通过在 RegisterType 中命名它们来注册这些实例,然后稍后通过 [Dependency(name)] 属性引用它们。

此外,A 还依赖于其他一些类,我们称它们为 Dep1、Dep2 和 Dep3。要执行 A 的初始化,我必须拥有我的所有依赖项和有关 channel 的信息。

我尝试使用以下策略:

  1. 通过 RegisterType 和 InjectionConstructor 参数对 Dep1、Dep2 和 Dep3 进行属性注入(inject)并在构造函数中设置 A 的 Channel。但是我怎么知道 A 什么时候准备好初始化呢?据我所知,我无法对属性(property)注入(inject)顺序做出任何假设。

  2. 所有四项的构造函数注入(inject)。恕我直言,这将是最干净的解决方案,因为我可以在构造函数中执行初始化。但我无法在 Unity 中使用它。为 Channel 使用 InjectionConstructor 参数注册 A 会引发异常,并且使用四个 InjectionConstructor 参数注册似乎很难看。

  3. Dep1、Dep2 和 Dep3 的构造函数注入(inject)以及 Channel 的属性注入(inject)。然后我可以在 Channel setter 中初始化我的类。它适用于这种情况,但如果 A 将被多个属性参数化怎么办?然后我就不知道 A 何时完全构建并准备好初始化。

应该如何进行初始化?或者也许我让事情变得过于复杂。

最佳答案

您没有确切说明您在策略 #2 中观察到的异常是什么,但这是我将使用的方法(考虑到您的其他要求能够在成功解决所有依赖项的情况下进行其他初始化)。我怀疑问题是您没有为构造函数的所有参数提供“值”... InjectionConstructor假定您想要的构造函数与提供给 InjectionConstructor 的值的类型匹配。 .

例如如果你想为这样的类注册一个构造函数......

public class AudioChannelViewModel {
public AudioChannelViewModel(Channel channel, Dep1 dep1, Dep2 dep2, Dep3 dep3) {
...
}
}

你应该这样注册...

container.RegisterType<AudioChannelViewModel>("left", 
new InjectionConstructor(Channel.Left,
typeof(Dep1), typeof(Dep2), typeof(Dep3)));
container.RegisterType<AudioChannelViewModel>("right",
new InjectionConstructor(Channel.Right,
typeof(Dep1), typeof(Dep2), typeof(Dep3)));

Unity 将使用提供的值作为第一个参数(Channel 枚举值),然后解析 Dep1 , Dep2Dep3实例。您也可以使用 ResolvedParameter<T>作为 InjectionConstructor 的参数如果有 Dep1 的特定命名实例, Dep2Dep3你需要的。

只提供Channel.LeftChannel.Right单独是不够的,因为 Unity 会认为它被要求使用一个只有 Channel 的构造函数争论。

或者;如果您已经尝试过但它不起作用...也许 Unity 在这种情况下不支持枚举(双关语)。

MSDN page可能会更清楚地说明这个问题。

关于c# - 用枚举参数化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6002247/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com