2012-01-22 35 views
2

我一直在我的项目中使用Unity一段时间。我有一个单身容器,我用它来注册类型和/或实例,然后解决。统一依赖注入(构造函数或属性)

今天我想通过使用属性或构造函数注入来自动化一些实例。

我开始使用Logger类。在申请开始我有这样的代码:

RegisterType<Logger, Logger>(); 

比我的ViewModel

[Dependency] 
    public Logger MyLogger { 
     get; 
     set; 
    } 

这是我如何实例化具有这个属性(在MainWindow.xaml.cs)的视图模型

private void InitializeViewModel() { 
    _vm = new MainViewModel(MainGrid); 
    ... 
    MyContainer.GetInstance().Container.RegisterInstance<MainViewModel>(_vm); 

我无法让[属性注入器]工作。属性注入需要与构造函数配对吗?我已经使用了一个构造函数,它有一些参数..

+1

如何创建包含记录器属性的对象? –

+0

更新了我的问题 –

+0

这就是我所怀疑的,请参阅@WiktorZychia的答案:) –

回答

2

你的例子中有些问题。如果您要将Logger注入MainViewModel,则必须让容器为您创建MainViewModel

但是,在您的代码中,您正在自己创建它。我看着它,它应该是:

_vm = Container.Resolve<MainViewModel>(); 

或至少

_vm = new MainViewModel(); 
Container.BuildUp(_vm); 
+0

谢谢。就是这样。问题是,如果我调用Container.Resolve ()..是否意味着它每次都会创建一个MainViewModel的新实例,或者它只会实例化一次,并在所有后续调用Resolve时返回该实例? –

+0

'RegisterInstance'有效地为你的对象实现一个单例行为。它为'Resolve'的所有后续调用返回'MainViewModel'的同一个实例。 http://msdn.microsoft.com/en-us/library/ff660872(v=pandp.20).aspx – Andreas

+0

安德烈亚斯,谢谢,RegisterIntance是自我解释..我问的是解决时,不使用RegisterInstance的行为 –

1

而不是使用new MainViewModel()创建视图模型,你需要有你的团结集装箱做创作。

Container.RegisterType<MainViewModel>(
    new ContainerControlledLifetimeManager(), 
    new InjectConstructor(MainGrid) 
    ); 

然后你就可以使用Container.Resolve<MainViewModel>()让你单身原名_vm

注意:ContainerControlledLifetimeManager部分告诉Unity只创建一个MainViewModel实例并返回任何事物。