2015-04-06 4 views
4

Мое решение имеет 4 проекта в немStructureMap решить зависимость между проектами

  1. UI
  2. Инфраструктура
  3. лиц
  4. Тесты

Все кода-первой установки базы данных и настройка 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, поэтому я хочу быть уверенным, что я не просто делаю жизнь сложнее.

+0

Есть ли проблема по перемещению контейнера ioc в слой asp.net mvc? и оставил только интерфейс в инфраструктуре (если необходимо) –

+0

Вы можете поместить реестр в свой уровень пользовательского интерфейса для управления регистрациями, которые более специфичны для уровня пользовательского интерфейса. Кроме того, вы можете «Сканировать (x => x.AddAllTypesOf ())'. –

ответ

8

Вы можете сделать с функциями реестровых StructureMap

Прежде всего, необходимо создать реестр в каждом проекте, как показано ниже.

public class InfrastructureRegistry : Registry 
{ 
    public InfrastructureRegistry() 
    { 
     Scan(scan => 
     { 
      scan.TheCallingAssembly(); 
      scan.WithDefaultConventions(); 

     }); 

     //any spefic implementation 
    } 
}    

Тогда вам нужно создать свой контейнер, как показано ниже.

return new Container(
      x => x.Scan 
        (
         scan => 
         { 
          scan.Assembly("YourProject.UI"); 
          scan.Assembly("YourProject.Infrastructure"); 
          scan.Assembly("Your.Entities"); 
          scan.WithDefaultConventions(); 
          scan.LookForRegistries(); 
         } 
        ) 
     ); 

Здесь я разместил scan.lookforregistries, который будет искать реестр в каждом проекте. Здесь я поставил только имя сборки. Вам нужно заменить ваши сборки.

Таким образом, вы можете получить доступ к этому для каждого проекта, и он будет подключать все вещи.

+0

Блестящий, спас мне потенциально огромный рефактор.Большое спасибо – James

+0

Добро пожаловать –

+0

Как использовать этот подход, чтобы избежать необходимости ссылки на инфраструктуру из ваших проектов пользовательского интерфейса: https://ardalis.com/avoid-referencing-infrastructure-in-visual-studio-solutions – ssmith

Смежные вопросы