2016-08-04 304 views
0

你好,我有一个WPF应用程序中的依赖注入问题。这里是我的代码: App.xaml.cs:WPF依赖注入

IUnityContainer container = new UnityContainer(); 
    container.RegisterType<ICarViewModel, CarViewModel>(); 
    container.RegisterType<MainWindow>(); 
    MainWindow mainWindow = container.Resolve<MainWindow>(); 
    mainWindow.Show(); 

CarViewModel.cs:

public ObservableCollection<Car> Cars{ get; } = new ObservableCollection<Car>() 
    { 
     new Car() {Name = "Audi"}, 
     new Car() {Name = "Peugeot"}, 
     new Car() {Name = "Renault"}, 
    }; 

CarView.cs:

public partial class CarView : UserControl, ICarView 
{ 
    public CarView() 
    { 
     InitializeComponent(); 
    } 

    public CarView(CarViewModel carViewModel) : this() 
    { 
     DataContext = carViewModel; 
    } 
} 

CarView.xaml:

 <ItemsControl ItemsSource = "{Binding Path = Cars}"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation = "Horizontal"> 
         <TextBlock Text = "{Binding Path = Name, Mode = OneWay}"/> 
        </StackPanel> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </StackPanel> 

MainWindow.xaml:

<view:CarView x:Name = "CarViewControl"></view:CarView> 

Unity容器仍然只调用不带CarView参数的构造函数。 感谢您的建议

+0

取出无参数构造函数?这可能只是默认使用那个。 – Clint

+0

什么?请告诉我该怎么做? – bluray

+0

您只需删除不带任何参数的构造函数,并保留那个。确保将调用移动到'InitializeComponent()'到构造函数,该构造函数接受参数并移除':this()'调用,你应该没问题。 – Clint

回答

2

您可以用这种方式注册类型:

container.RegisterType(typeof(MainWindow), typeof(MainWindow), new InjectionConstructor(new InjectionParameter(typeof(CarViewModel), CarViewModelInstance))); 

或者你可以在主窗口构造函数中使用[InjectionConstructor]属性:

[InjectionConstructor] 
public CarView(CarViewModel carViewModel) : this() 

此外,您还可以通过[依赖]属性,因此Unity会尝试从其注册的实例中解析该参数的值:

[InjectionConstructor] 
public CarView([Dependency] CarViewModel carViewModel) : this() 

您例如最好的办法也许可以看起来在某种程度上是这样的:

container.RegisterType<ICarViewModel, CarViewModel>("Car"); 
.... 
[InjectionConstructor] 
public CarView([Dependency("Car")] CarViewModel carViewModel) : this() 

有很多方法可以做到你需要做的..更多信息什么:https://msdn.microsoft.com/en-us/library/dn178463(v=pandp.30).aspx

一些测试代码:

var container1 = new UnityContainer(); 
container1.RegisterType(typeof(IBar), typeof(Bar), "Bar"); 
container1.RegisterType<Foo>(); 

public interface IBar 
{ 
} 

public class Bar : IBar 
{ 
} 

public class Foo 
{ 
     public IBar Bar 
     { 
     get; 
     private set; 
     } 

     public Foo() 
     { 
     } 

     [InjectionConstructor] 
     public Foo([Dependency("Bar")] Bar bar) 
     { 
     Bar = bar; 
     } 
} 
+0

谢谢我使用最后一个例子,但仍然首先调用(无参数)构造函数。 – bluray

+0

这很奇怪。 [InjectionConstructor]属性告诉Unity,这是一个构造函数,必须被调用。我会看一看。 – paYa

+0

你确定,第二个构造函数根本不被调用吗?我做了一些测试,代码是正确的。注意:你的第一个(无参数)构造函数也会被调用(因为第二个构造函数中的“:this()”)。 – paYa