使用枚举参数化对象
我正在使用C#和Unity依赖注入在WPF中开发MVVM应用程序。我正在为以下问题寻找最干净的解决方案。例如,我有一个类AudioChannelViewModel(让我们简称为A),我想注册两个类的实例,一个用于Channel.Left,一个用于Channel。对。这本身并不是一个问题,因为我通过将它们命名为RegisterType,然后在[Dependency(name)]
属性中引用它们来注册这些实例。使用枚举参数化对象
此外,A取决于其他一些类,让我们称之为Dep1,Dep2和Dep3。为了执行A的初始化,我必须拥有我的所有依赖关系和关于Channel的信息。
我尝试使用以下策略:
地产注入DEP1,DEP2和DEP3的,并通过与InjectionConstructor参数设置RegisterType A的通道中构造。但是,我应该如何知道A什么时候可以初始化? AFAIK我不能假设任何有关物业注入订单。
建设者注入所有四个项目。这将是恕我直言的最干净的解决方案,因为我可以在构造函数中执行初始化。但是我无法在Unity中使用它。为Channel注册A与InjectionConstructor参数会引发异常,并且注册四个InjectionConstructor参数看起来很难。
建设者注入Dep1,Dep2和Dep3以及Channel的属性注入。然后我可以在Channel setter中初始化我的课程。它适用于这种情况,但是如果A会被多个属性参数化,该怎么办?然后我不知道A何时完全建立并准备好进行初始化。
应该如何执行初始化?或者,我可能让事情变得过于复杂。
你并没有确切地说明在策略#2中观察到的异常,但这是我将使用的方法(考虑到您的其他需求可以使其他初始化成功解决所有依赖关系) 。我怀疑问题是您没有为构造函数的所有参数提供'值'... InjectionConstructor
假定您想要的构造函数是与提供给InjectionConstructor
的值的类型相匹配的构造函数。
E.g.如果你想注册一个构造这样一类...
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)));
统一将使用所提供的值作为第一个参数(一个Channel
枚举值),然后将解析Dep1
,Dep2
和Dep3
实例。如果您需要Dep1
,Dep2
或Dep3
的特定命名实例,您也可以使用ResolvedParameter<T>
作为InjectionConstructor
的参数。
仅仅提供Channel.Left
或Channel.Right
是不够的,因为Unity会认为它被要求使用一个构造函数,只有一个Channel
参数。
或;如果你已经尝试过,并且它不工作......也许Unity在这种情况下不支持枚举(双关意图)。
这MSDN page可能会在这个问题上发光一些。
哦,我只是不知道我可以将依赖类型传递给InjectionConstructor的构造函数。谢谢!你的方法完美运作。 – madbadger 2011-05-15 10:05:48