Unity: проблема с разрешением RIA DomainContext - PullRequest
0 голосов
/ 05 февраля 2011

Я использую 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>());

        }

Представление принимает модель представления в качестве зависимости:

 public NavigationView(NavigationViewModel viewModel)
        {
            InitializeComponent();

            Loaded += (s, e) =>
                          {
                              DataContext = 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 голосов
/ 15 февраля 2011

На самом деле лучше всего создать слой для 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 голосов
/ 11 февраля 2011

Я не вижу здесь много неправильного. Тем не менее, я использую метод 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. Лично я предпочитаю контролировать способ разрешения типа контейнером.

...