2014-08-22 3 views
0

У меня есть веб-приложение в ASP.NET MVC с использованием шаблона StructureMap DI для извлечения данных из BAL в пользовательский интерфейс и используемого шаблона многоуровневой архитектуры для извлечения данных из DAL в BAL. найти ниже диаграмму класса.Как использовать StructureMap для приложений реального мира

See my class diagram

Итак, я устал конфиг регистр службы StructureMap в

public class Bootstrapper 
    { 
      public static void Initialize() 
      { 
       StructureMapConfiguration.AddRegistry(new ServiceRegistry()); 
      } 
      public class ServiceRegistry : Registry 
      { 
       protected override void configure() 
       { 
        ForRequestedType<IVehicleService>().TheDefaultIsConcreteType<VehicleService>(); 
       } 
      } 
    } 

Но конфигурация не применяется правильно, произошли ошибки и сказать «некоторые методы не находят в классе интерфейса». конечно, это правильно. потому что в моем классе BAL унаследовали некоторые методы/функции из DAL. Итак, пожалуйста, помогите мне исправить эту проблему или дать лучшую практику для применения моего проекта.

ответ

4

Я рекомендую вам пересмотреть способ организации ваших классов, и попытаться применить Dependency Inversion Principle. Как вы структурировали свои классы, ваш проект пользовательского интерфейса будет зависеть от вашего проекта BAL, который будет зависеть от вашего проекта DAL. Вам нужны ваши конкретные данные о том, как вы разговариваете с вашей базой данных (в DAL), чтобы зависеть от абстракций (в вашем БАЛе), а не наоборот. Это можно легко осуществить, реализовав Onion Architecture (также порты и адаптеры или шестиугольную архитектуру). У меня есть a brief online course covering converting from a traditional N-tier architecture (like yours) to this approach.

Кроме того, я думаю, вы хотели использовать шаблон репозитория, а не респиратор, на диаграмме классов. Вы можете увидеть простой способ начать работу resolving dependencies using StructureMap in ASP.NET MVC 5.

Как только вы создали эту архитектуру, все станет очень простым. Если вы последовательно назовете свои интерфейсы, вы можете использовать метод StructureMap WithDefaultConventions(), чтобы исключить необходимость регистрации каждого конкретного типа в связанном с ним интерфейсе. Например, вы можете определить IVehicleRepository (в вашем основном проекте) и его реализацию VehicleRepository (в вашем проекте инфраструктуры, который ссылается на Core). В этот момент в вашем проекте пользовательского интерфейса, где вы настраиваете StructureMap, ваши контроллеры могут просто запрашивать IVehicleRepository в своих конструкторах, а StructureMap будет выполнять такие запросы с помощью вашей реализации VehicleRepository (если вы не настроили ее иначе).

+0

Спасибо, друг, это здорово. – user640921

1

Не переопределяйте метод «configure()», а выполняйте регистрацию в конструкторе для вашего класса реестра.

Возможно, вы используете более раннюю версию StructureMap, поскольку синтаксис регистрации более краток в более поздних версиях.

Есть хорошие примеры в исходном коде:

https://github.com/structuremap/structuremap/blob/master/src/StructureMap.Testing/Configuration/DSL/RegistryTester.cs

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