Мое решение имеет 4 проекта в немStructureMap решить зависимость между проектами
- UI
- Инфраструктура
- лиц
- Тесты
Все кода-первой установки базы данных и настройка structuremap находится в рамках проекта инфраструктуры. Пользовательский интерфейс представляет собой ASP.NET MVC5. Проект инфраструктуры также содержит некоторые реализации WebService.
В проекте пользовательского интерфейса есть несколько классов, которые выступают в качестве слоя между контроллерами и внешними WebServices. Например:
UI.Services.MappingService.cs
будет не используя методы в Infrastructure.ExternalWebServices.MappingWebService.cs
До сих пор было никаких проблем, имена интерфейса все совпадают с именами конкретных классов, так StructureMap решает их правильно. Тем не менее, в настоящее время существует необходимость вносить изменения и реализовывать несколько конкретных классов из одного из сервисных интерфейсов.
Проект инфраструктуры не может ссылаться на пользовательский интерфейс, поскольку он создает круговую зависимость. Используя пример сопоставления, мне понадобится
UI.Services.Interfaces.IMappingService
, чтобы иметь разные бетоны, structmap разрешит правильный либо по логике в файле реестра, либо в классе фабрики. Проблема, являющаяся файлами реестра, находится в проекте инфраструктуры, который не знает о пользовательском интерфейсе, поэтому For(...).Use(...)
невозможен.
Если я переместил интерфейс к проекту Entities, он может их увидеть, но это также будет связано с перемещением конкретных классов, которые могут сломать множество ссылок и потребовать множество файлов для исправления. Весь сервисный уровень в пользовательском интерфейсе плюс несколько моделей просмотра должны будут перейти к проекту Entities, чтобы сделать это возможным.
Есть ли более простой способ? Я не эксперт по DI/StructureMap, поэтому я хочу быть уверенным, что я не просто делаю жизнь сложнее.
Есть ли проблема по перемещению контейнера ioc в слой asp.net mvc? и оставил только интерфейс в инфраструктуре (если необходимо) –
Вы можете поместить реестр в свой уровень пользовательского интерфейса для управления регистрациями, которые более специфичны для уровня пользовательского интерфейса. Кроме того, вы можете «Сканировать (x => x.AddAllTypesOf())'. –