2016-08-04 298 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