3

我使用帶有MVVM模式和Prism的WPF開發應用程序。視圖被添加到ModuleCatalog中,並且視圖模型被註冊到統一容器中。爲此,我使用負責創建shell的Bootstrapper,配置統一容器和模塊目錄。
現在的問題是,如何注入我的EntityContext到幾個視圖模型。
首先引導程序: 構造函數使用Unity/Prism/MVVM注入ObjectContext


public class Bootstrapper : UnityBootstrapper 
    { 
     protected override DependencyObject CreateShell() 
     { 
      Shell shell = Container.Resolve(); 
      shell.Show(); 
      return shell; 
     }

protected override void ConfigureContainer() 
    { 
     base.ConfigureContainer(); 
     Container.RegisterType<EntityContext >("Context"); 
     Container.RegisterType<PersonViewModel>(new InjectionConstructor(
      new ResolvedParameter<EntityContext >("Context"))); 
    } 

    protected override IModuleCatalog GetModuleCatalog() 
    { 
     ModuleCatalog catalog = new ModuleCatalog(); 
     catalog.AddModule(typeof(PersonModule)); 
     return catalog; 
    } 

視圖模型看起來像(摘錄)


public class PersonViewModel : ViewModelBase, IDataErrorInfo 
    { 
     private Person _person; 
     private PersonRepository _repository; 
     readonly EntityContext _context;

public PersonViewModel(EntityContext context) 
    { 
     _context = context; 
     _person = new Person(); 
     _repository = new PersonRepository(context); 
    } 

模塊:


    public class PersonModule : IModule 
    { 
     private readonly IRegionManager regionManager;

public PersonModule(IRegionManager regionManager) 
    { 
     this.regionManager = regionManager; 
    } 

    public void Initialize() 
    { 
     regionManager.RegisterViewWithRegion("PersonData", typeof(PersonView)); 
    } 

} 

視圖代碼隱藏:


    public partial class PersonView : UserControl 
    { 
     private PersonViewModel _vm;

public PersonView() 
    { 
     InitializeComponent(); 
    } 

    [Dependency] 
    public PersonViewModel VM 
    { 
     get 
     { 
      return this.DataContext as PersonViewModel; 
     } 
     set 
     { 
      _vm = value; 
      this.DataContext = _vm; 
     } 
    }  
} 

我不知道如果我的方法是在原則,但對於將更改保存到數據庫的緣故工作,我需要我的知識範圍內對其做出的更改。現在它顯然不工作,因爲 ModuleInitializeException發生。 Stacktrace:
初始化模塊'PersonModule'時發生異常。
- 異常消息是:嘗試向區域'PersonData'添加視圖時發生異常。
- 最可能引起的異常是:'System.InvalidOperationException:類型EntityContext具有長度爲1的多個構造函數。無法消除歧義。
貝Microsoft.Practices.ObjectBuilder2.ConstructorSelectorPolicyBase 1.FindLongestConstructor(Type typeToConstruct)
bei Microsoft.Practices.ObjectBuilder2.ConstructorSelectorPolicyBase
1.SelectConstructor(IBuilderContext上下文)
貝Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.PreBuildUp(IBuilderContext上下文)
貝Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext上下文) 」。
但也檢查InnerExceptions的更多細節或調用.GetRootException()。 - 模塊嘗試從中加載的程序集爲:App,版本= 1.0.0.0,Culture = neutral,PublicKeyToken = null
檢查異常的InnerException屬性以獲取更多信息。如果在DI容器中創建對象時發生異常,可以使用exception.GetRootException()來幫助找到問題的根本原因。

如果還有其他的解決方案,我對這個問題很開放,但是我想要使用或多或少的基本結構。
在此先感謝。

+0

你能告訴你的PersonModule的代碼? – BFree 2010-09-08 15:31:14

回答

5

您必須配置容器來消除歧義的EntityContext建設:

Container.RegisterType<EntityContext >("Context", new InjectionConstructor(...)) 
+0

我試過了,但構造函數應該消除歧義,因爲自動生成的設計器文件包含從ObjectContext繼承的類EntityContext。有三個帶零和一個參數的構造函數 - EntityContext(),EntityContext(string connectionString),EntityContext(EntityConnection連接)。因此,它也應該只適用於Container.RegisterType (「Context」),不是嗎? – 2010-09-09 11:14:26

+0

不,它沒有,因爲容器試圖使用最大數量的參數構造函數。如果你有兩個帶有1個參數的構造函數,它就不知道如何構建它。你必須消除歧義(或者在我的答案中配置容器,或者使用InjectionConstructor屬性) – onof 2010-09-09 12:04:32

+0

太棒了。現在我明白你的觀點和工作。 – 2010-09-09 12:47:26