2011-05-14 78 views
4

我正在使用C#和Unity依赖注入在WPF中开发MVVM应用程序。我正在为以下问题寻找最干净的解决方案。例如,我有一个类AudioChannelViewModel(让我们简称为A),我想注册两个类的实例,一个用于Channel.Left,一个用于Channel。对。这本身并不是一个问题,因为我通过将它们命名为RegisterType,然后在[Dependency(name)]属性中引用它们来注册这些实例。使用枚举参数化对象

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

我尝试使用以下策略:

  1. 地产注入DEP1,DEP2和DEP3的,并通过与InjectionConstructor参数设置RegisterType A的通道中构造。但是,我应该如何知道A什么时候可以初始化? AFAIK我不能假设任何有关物业注入订单。

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

  3. 建设者注入Dep1,Dep2和Dep3以及Channel的属性注入。然后我可以在Channel setter中初始化我的课程。它适用于这种情况,但是如果A会被多个属性参数化,该怎么办?然后我不知道A何时完全建立并准备好进行初始化。

应该如何执行初始化?或者,我可能让事情变得过于复杂。

回答

4

你并没有确切地说明在策略#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,Dep2Dep3实例。如果您需要Dep1,Dep2Dep3的特定命名实例,您也可以使用ResolvedParameter<T>作为InjectionConstructor的参数。

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

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

MSDN page可能会在这个问题上发光一些。

+0

哦,我只是不知道我可以将依赖类型传递给InjectionConstructor的构造函数。谢谢!你的方法完美运作。 – madbadger 2011-05-15 10:05:48