使用枚举参数化对象

时间:2011-05-14 13:51:07

标签: c# mvvm dependency-injection unity-container

我正在使用C#和Unity Dependency Injection在WPF中开发MVVM应用程序。我正在为以下问题寻找最干净的解决方案。

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

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

我尝试使用以下策略:

  1. Dep1,Dep2和Dep3的属性注入,并通过RegisterType和InjectionConstructor参数在构造函数中设置A的C​​hannel。但是,我怎么知道A何时准备初始化? AFAIK我不能假设房产注入订单。

  2. 构造函数注入所有四个项目。这将是恕我直言最干净的解决方案,因为我将能够在构造函数中执行初始化。但是我无法在Unity中使用它。为Channel注册一个带有InjectionConstructor参数的抛出异常,并注册四个InjectionConstructor参数似乎很难看。

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

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

1 个答案:

答案 0 :(得分:4)

您没有确切地说出您在策略#2中观察到的异常,但这是我将使用的方法(考虑到其他要求能够进行其他初始化,并且所有依赖关系都已成功解决)。我怀疑问题在于你没有为构造函数的所有参数提供“值”... InjectionConstructor假设你想要的构造函数与提供给{{{{1}的值的类型相匹配。 1}}。

E.g。如果你想为这样一个类注册一个构造函数......

InjectionConstructor

你应该注册它......

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

Unity将使用提供的值作为第一个参数(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))); 枚举值),然后将解析ChannelDep1Dep2个实例。如果您需要Dep3ResolvedParameter<T>InjectionConstructor的特定命名实例,也可以使用Dep1作为Dep2的参数。

单独提供Dep3Channel.Left是不够的,因为Unity会认为它被要求使用只有Channel.Right参数的构造函数。

或者;如果你已经尝试过并且它不能正常工作......也许Unity在这种情况下不支持枚举(双关语)。

这个MSDN page可能会对这个问题有所了解。