0

我使用PRISM 4,并且几乎掌握了所有功能,但是只要我想将我的DomainContext类(RIA)注入到视图模型中,地狱就会松动。 :)如果有经验的Unity/Prism开发人员可以给我一个建议如何继续,那将是非常棒的。统一:解决RIA的问题DomainContext

在我的引导程序,我注册在Unity集装箱所需的类是这样的:

protected override void ConfigureContainer() 
     { 
      base.ConfigureContainer(); 
      Container.RegisterType<SCMDomainContext>(); 
     } 

内NavigationModule,在构造函数我有以下的与特定区域注册NavigationView。

public NavigationModule(IUnityContainer container, IRegionManager regionManager) 
     { 
      _container = container; 
      _regionManager = regionManager; 

      _regionManager.RegisterViewWithRegion(Constants.NavRegion,() => _container.Resolve<NavigationView>()); 

     } 

观需要视图模型的依赖性:

public NavigationView(NavigationViewModel viewModel) 
     { 
      InitializeComponent(); 

      Loaded += (s, e) => 
          { 
           DataContext = viewModel; 
          };    
     } 

视图模型有以下几点:

public NavigationViewModel(SCMDomainContext context) 
     { 
      _context = context; 
      ConstructCommon(); 
     } 

当我评论这个构造函数,并把一个带空的构造函数,这一切都很好,出于某种原因,我无法解决SCMDomainContext类。 Ria Services提供的是为您创建的域上下文。

由于我使用的是Silverlight,我看不到跟踪异常的堆栈跟踪,我得到的只是此页面上的消息。请问我错过了什么?

Microsoft JScript runtime error: Unhandled Error in Silverlight Application An exception occurred while initializing module 'NavigationModule'. 
    - The exception message was: Activation error occured while trying to get instance of type NavigationModule, key '' 
    Check the InnerException property of the exception for more information. If the exception occurred 
    while creating an object in a DI container, you can exception.GetRootException() to help locate the 
    root cause of the problem. at Microsoft.Practices.Prism.Modularity.ModuleInitializer.HandleModuleInitializationError(ModuleInfo moduleInfo, String assemblyName, Exception exception) 
    at Microsoft.Practices.Prism.Modularity.ModuleInitializer.Initialize(ModuleInfo moduleInfo) 
    at Microsoft.Practices.Prism.Modularity.ModuleManager.LoadModulesThatAreReadyForLoad() 
    at Microsoft.Practices.Prism.Modularity.ModuleManager.IModuleTypeLoader_LoadModuleCompleted(Object sender, LoadModuleCompletedEventArgs e) 
    at Microsoft.Practices.Prism.Modularity.XapModuleTypeLoader.RaiseLoadModuleCompleted(LoadModuleCompletedEventArgs e) 
    at Microsoft.Practices.Prism.Modularity.XapModuleTypeLoader.HandleModuleDownloaded(DownloadCompletedEventArgs e) 
    at Microsoft.Practices.Prism.Modularity.XapModuleTypeLoader.IFileDownloader_DownloadCompleted(Object sender, DownloadCompletedEventArgs e) 
    at Microsoft.Practices.Prism.Modularity.FileDownloader.WebClient_OpenReadCompleted(Object sender, OpenReadCompletedEventArgs e) 
    at System.Net.WebClient.OnOpenReadCompleted(OpenReadCompletedEventArgs e) 
    at System.Net.WebClient.OpenReadOperationCompleted(Object arg) 

你这个帮助是高度赞赏, 卡瓦

回答

0

事实上,它最好像这样为DomainContext创建一个图层。那么它可以通过IoC轻松解决:

public class ContactModuleService : IContactModuleService 
    { 
     readonly SCMDomainContext _context = new SCMDomainContext(); 

     #region Implementation of IContactModuleService 

     public EntitySet<Contact> Contacts 
     { 
      get { return _context.Contacts; } 
     } 

     public EntityQuery<Contact> GetContactsQuery() 
     { 
      return _context.GetContactsQuery(); 
     } 

     public SubmitOperation SubmitChanges(Action<SubmitOperation> callback, object userState) 
     { 
      return _context.SubmitChanges(callback, userState); 
     } 

     public SubmitOperation SubmitChanges() 
     { 
      return _context.SubmitChanges(); 
     } 

     public LoadOperation<TEntity> Load<TEntity>(EntityQuery<TEntity> query, Action<LoadOperation<TEntity>> callback, object userState) where TEntity : Entity 
     { 
      return _context.Load(query, callback, userState); 
     } 

     public LoadOperation<TEntity> Load<TEntity>(EntityQuery<TEntity> query) where TEntity : Entity 
     { 
      return _context.Load(query); 
     } 

     #endregion 
    } 
0

我看不到太多错在这里。不过话说回来,我使用的是从接口的初始化方法以下列方式注册类型和视图地区:

#region properties 
[Dependency] 
public IUnityContainer Container { get; set; } 

[Dependency] 
public IRegionManager RegionManager { get; set; } 
#endregion 

public virtual void Initialize() 
{ 
    this.Container.RegisterType<NavigationViewModel>(new ContainerControlledLifetimeManager()); 
    this.Container.RegisterType<NavigationView>(new ContainerControlledLifetimeManager()); 

    this.RegionManager.RegisterViewWithRegion(Constants.NavRegion,() => this.Container.Resolve<NavigationView>()); 
} 

不能确定它是否有差别,如果你不明确注册视图模型和“查看”类型。就我个人而言,我更喜欢控制容器如何解决类型的方式。