Unity:解决RIA DomainContext的问题

时间:2011-02-05 20:02:50

标签: silverlight dependency-injection unity-container prism wcf-ria-services

我正在使用PRISM 4并且几乎涵盖了所有功能,但是只要我想将我的DomainContext类(RIA)注入到我的视图模型中,地狱就会崩溃。 :)如果有经验的Unity / Prism开发人员可以给我一个如何继续的建议,那将是很棒的。

在我的引导程序中,我正在Unity Container中注册所需的类,如下所示:

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

在NavigationModule中,我在ctor中有以下内容,用于向特定区域注册NavigationView。

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

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

        }

View将View Model视为依赖:

 public NavigationView(NavigationViewModel viewModel)
        {
            InitializeComponent();

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

ViewModel具有以下内容:

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

一旦我评论这个ctor并且放了一个空的ctor,一切都很好,因为某些原因我无法解析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)

我非常感谢您的帮助, 卡瓦

2 个答案:

答案 0 :(得分:0)

我在这里看不出太多错误。但话说回来后,我通过以下方式使用接口中的Initialize方法来注册区域的类型和视图:

 #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>());
}

如果您没有明确注册ViewModel和View类型,则不确定它是否有所作为。我个人更喜欢控制容器如何解析类型。

答案 1 :(得分: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
    }