PRISM. Задача с RegisterInstance - PullRequest
2 голосов
/ 17 декабря 2010

Я хотел бы кое-что понять.

У меня есть проект приложения Silverlight "Service", который содержит класс Module и следующую строку кода в его метод "Initialize" для регистрации типа:

unityContainer.RegisterInstance<IService>(instance);

И у меня есть еще один проект приложения Silverlight «Управление».Модуль описан в файле catalog.xaml:

<Modularity:ModuleInfo
    Ref="Service.xap"
    ModuleName="ServiceModule"
    ModuleType="Service.ModuleDefinitions.Module, Service, Version=1.0.0.0">
</Modularity:ModuleInfo>

. Вы можете найти код "Bootstrapper" ниже:

protected override IModuleCatalog CreateModuleCatalog()
{
    Uri uri = new Uri("catalog.xaml", UriKind.Relative);
    ModuleCatalog moduleCatalog = Microsoft.Practices.Prism.Modularity.ModuleCatalog.CreateFromXaml(uri);
    // NOTE: State of "ServiceModule" is "NotStarted" here...
    return moduleCatalog;
}

protected override DependencyObject CreateShell()
{
    Shell shell = new Shell();
    Application.Current.RootVisual = shell;
    IRegionManager regionManager = Container.Resolve<IRegionManager>();
    regionManager.RegisterViewWithRegion("MainRegion", typeof(MainView));
    return shell;
}

Один класс ViewModel (в проекте "Controls") содержит ссылкув интерфейс IService, который должен быть зарегистрирован в классе Modul проекта «Сервис».

Методы CreateModuleCatalog () и CreateShell () выполнялись без проблем во время отладки программы, но я получил исключение перед выполнением Initialize ()метод с регистрацией IService.

Сообщение об ошибке: «Текущий тип, Service.ServiceReference.IService, является интерфейсом и не может быть создан. Вам не хватает отображения типов?»

Я думалчто мне нужно регистрировать / отображать типы только один раз, и если я сделал это в проекте класса «Модуль», то мне не нужно было делать это снова в проекте «Управление».

Мне нужна помощь, чтобы понять ситуацию выше :)

1 Ответ

3 голосов
/ 18 декабря 2010

Вы уверены, что этот код выполняется, прежде чем пытаться разрешить объект из контейнера?

unityContainer.RegisterInstance<IService>(instance);

Как объяснено здесь , использование метода RegisterInstance с интерфейсом автоматически устанавливает отображение, поэтому вам нет необходимости делать это явно.

Однако, если вы пытаетесь разрешить интерфейс без установления типа , который сначала устанавливается, вы получите ошибку, которую получаете, поскольку нет способа создать экземпляр интерфейса.

...