我正在使用C#和Unity Dependency Injection在WPF中开发MVVM应用程序。我正在为以下问题寻找最干净的解决方案。
我的一些类使用枚举进行参数化,例如,我有一个类AudioChannelViewModel(我们称之为简短的A),我想注册该类的两个实例,一个用于Channel.Left,另一个用于Channel.Right 。仅此一项不是问题,因为我通过在RegisterType中命名它们然后通过[Dependency(name)]
属性引用它们来注册这些实例。
此外,A依赖于其他一些类,我们称之为Dep1,Dep2和Dep3。要执行A的初始化,我必须拥有所有依赖项和有关Channel的信息。
我尝试使用以下策略:
Dep1,Dep2和Dep3的属性注入,并通过RegisterType和InjectionConstructor参数在构造函数中设置A的Channel。但是,我怎么知道A何时准备初始化? AFAIK我不能假设房产注入订单。
构造函数注入所有四个项目。这将是恕我直言最干净的解决方案,因为我将能够在构造函数中执行初始化。但是我无法在Unity中使用它。为Channel注册一个带有InjectionConstructor参数的抛出异常,并注册四个InjectionConstructor参数似乎很难看。
Dep1,Dep2和Dep3的构造函数注入以及Channel的属性注入。然后我可以在Channel setter中初始化我的类。它适用于这种情况,但是如果A将被多个属性参数化呢?然后我不知道A何时完全构建并准备初始化。
如何进行初始化?或者也许我让事情变得过于复杂。
答案 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)));
枚举值),然后将解析Channel
,Dep1
和Dep2
个实例。如果您需要Dep3
,ResolvedParameter<T>
或InjectionConstructor
的特定命名实例,也可以使用Dep1
作为Dep2
的参数。
单独提供Dep3
或Channel.Left
是不够的,因为Unity会认为它被要求使用只有Channel.Right
参数的构造函数。
或者;如果你已经尝试过并且它不能正常工作......也许Unity在这种情况下不支持枚举(双关语)。
这个MSDN page可能会对这个问题有所了解。