2012-02-11 3 views
2

Следующее предыдущее задание, которое я написал в StackOverFlow У меня есть следующая структура проекта для моего приложения для настольных приложений Prism.Разрешение зависимостей Unity в приложении Prism Desktop

Библиотека классов: Application.Common -> это содержит все мои DTOs и сервисные контракты, которые определены в моем уровне услуг WCF, который совершенно иное решение.

модули:Application.Modules.ServicesModule -> здесь я добавил ссылки на моей реализации WCF с помощью Add Service Reference. Я также зарегистрировать реализации моих типов IMyServiceContract определен в сборке Application.Common поэтому метод инициализации выглядит следующим образом: -

public void Initialise() 
{ 
    _container.RegisterType<IMyService, MyServiceClient>(new InjectionConstructor()); 
} 

Наконец у меня есть еще один модуль Application.Modules.FunctionalityModule это имеет конструктор, определенный следующим

public FunctionalityModule(IMyService myService){} 

, когда приложение пытается разрешить зависимость в FunctionalityModule во время выполнения следующих действий происходит ошибка

Exception occurred while: while resolving. 
Exception is: InvalidOperationException - The current type, AccountsSln.Common.ServiceContract.IMyService, is an interface and cannot be constructed. Are you missing a type mapping? 

Обычно я видел эту ошибку, потому что зависимость не была зарегистрирована, но в этом случае я знаю, что она есть в ServiceModule. Это связано с тем, что регистрация происходит в разных модулях? Есть ли другие предложения о том, как я могу реализовать свою структуру проекта для поддержки служб WCF в настольном приложении Prism?

Благодаря

Alex

Edit: Как я хотел использовать Общую сборку, чтобы определить свои контракты на обслуживание У меня были проблемы при использовании Add Service Reference. Оказывается, если вы используете Add Service Reference, сгенерированный код использует метаданные для создания типов клиентских сторон. Они имеют ту же подпись, что и в общей сборке, но различны. Чтобы я мог использовать контракты в общей сборке, я получил вдохновение из этого поста http://xaml.geek.nz/working-slightly-smarter-with-wcf. Это заставило меня начать в правильном направлении, но я думаю, что мне придется изучить, как сделать код более подходящим для производственной среды.

+0

Вы уверены, что ServicesModule загружается? И загружается ли он перед FunctionalityModule? –

+0

Да, если я нарушаю Инициализацию в ServiceModule, это определенно попадает. Кроме того, ServiceModule находится перед модулем FunctionalityModule в Bootstrapper, поэтому я предполагаю, что это означает, что он загружается раньше. – lostinwpf

+0

Где экземпляр _container поступает из ServiceModule? Он вводится через его конструктор или создается в модуле? –

ответ

1

Проблема в том, что вы не указали требуемое сопоставление от интерфейса к типу реализации. (Я предпочитаю использовать UnityContainerExtensions).

unityContainer.RegisterType < IStudentSearchService, StudentSearchService >(); 

Вам также необходимо указать зависимости модуля. Ваш FunctionalityModule зависит от ServicesModule. Как это делается, зависит от того, как создается ModuleCatalog. Итак, либо; в Bootstrapper's CreateModuleCatalog используйте moduleCatalog.AddModule или украсьте IModulesModuleAttribute и ModuleDependencyAttribute при использовании DirectoryModuleCatalog.

Конечно, UnityContainer можно настроить через файл app.config.

+0

Я считаю, что я добавил отображение. Я заметил, что если я добавлю ServiceReference, я должен сделать интерфейсную сторону отображения из Application.Modules.ServicesModule, чтобы он работал. Это не сработает, если я возьму интерфейсную сторону отображения из Application.Common, где я хочу его взять, и также является тем, что определено как мой интерфейс в реальной реализации WCF. – lostinwpf

0

Сгенерированные классы прокси-класса услуг являются частичными классами.Вы могли бы просто сделать их наследовать от IMyService в Общем собрании, добавляя что-то вроде следующий в проекте, где ссылки службы являются:

using Application.Common.IMyService; 

namespace Application.Modules.ServicesModule 
{ 
    public partial class MyServiceClient : Application.Common.IMyService 
    { 
    } 
} 
Смежные вопросы