我使用帶有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()來幫助找到問題的根本原因。
如果還有其他的解決方案,我對這個問題很開放,但是我想要使用或多或少的基本結構。
在此先感謝。
你能告訴你的PersonModule的代碼? – BFree 2010-09-08 15:31:14