2011-01-23 2 views
1

У меня есть asp.net MVC приложение имеет три слоя 1. DATAACCESS слой (библиотека классов) 2. бизнес-слой (библиотека классов) 3. веб-слой (asp.net MVC проект)StructureMap в многоуровневые приложения

, а также есть проект домена (библиотека классов для Poco)

Я делаю отображение StructureMap в моем Application_Start проекта MVC, но для сопоставления типов в dataAccesslayer (например, для. personRepository с IPersonReository) мне нужен ссылка DAL в моем веб-слое, который я считаю неправильным.

Ваши предложения Благодаря

ответ

2

Как прагматичный подход, что вы делаете, может быть в порядке , если вы можете сохранить дисциплину и никогда не использовать DAL из веб-уровня. Однако, как только ссылка там, это может быть удивительно сложно сделать - и как насчет других разработчиков проекта?

Лучший вариант заключается в разделить веб-слой на два слоя:

  1. Применение Бутстрапирование слоя. Это настоящий веб-проект, но помимо загрузки контейнера и реализации страниц Views (.aspx) ничего не должно быть. Это то, что мы называем Humble Executable. Он будет содержать ссылки на все другие проекты для их составления (через контейнер DI), но в остальном он ничего не делает. Мы называем это Register Resolve Release pattern.

  2. Application Model layer. Этот проект будет содержать всю вашу логику приложения (в отличие от логики домена): просмотр моделей и контроллеров. Он не нуждается ни в каких ссылках на DAL, но получит реализации, введенные в него контейнером DI.

+0

Большое спасибо Mark ... Уровень загрузочного приложения будет проектом asp.net mvc, а уровень Application Model будет проектом библиотеки классов? –

+0

Да, уровень Application Model может быть проектом библиотеки классов, но поскольку контроллеры будут там, он все равно будет ссылаться на соответствующие сборки ASP.NET MVC. –

0

Там нет ничего плохого в том, чтобы ссылка на DAL в вашем веб-проекта до тех пор, пока вы не сразу звонить в этой сборке. Но если вам неудобно с этим подходом, вы можете использовать реестр на своем бизнес-уровне и там регистрировать типы для DAL. Так как веб-слой в любом случае нужно будет иметь ссылку на бизнес-уровне, вы можете использовать этот реестр от бизнес-слоя в App Веб начинаются

Ниже приведен пример кода

Класс реестра в вашем слое Bsns

public class BusinessRegistry:Registry 
{ 
    public BusinessRegistry() 
    { 
     For<IDALInterface1>().Use<DALImpl1>(); 
    } 
} 

и в методе запуска приложения

var container = new Container(x => x.AddRegistry(new BusinessRegistry())); 
+0

Что делать, если есть 5 слоев .... хотя мы можем сделать реестр в каждом слое, но мы должны будем инициализировать их только в application_start ... так что нам все равно понадобится ссылка на все 5 слоев ... есть ли какая-нибудь работа для этого ... –

+0

5 слоев означает 5 проектов. Если бы это было так, я бы вернулся, чтобы переделать все это. Чем меньше проектов, тем лучше. В любом случае, к вашему первоначальному вопросу, я бы рекомендовал, что @Seemann предложил ниже, иметь проект начальной загрузки, который бы инициализировал контейнер DI со всеми зависимостями. – Hakeem

+0

yes hakeem, я иду с подходом seeman..thanks –

0

Как и другие говорили, ссылка на ваш DAL проекта не конец света, если вы не используете его неправильно (или, может быть, вообще в вашем веб-проекте). Я предпочитаю, чтобы проект Infrastructure содержал все вещи, связанные с сквозными проблемами. Среди прочего, это включает мой журнал и контейнер IoC.

+0

Спасибо Джастин за ваш ответ, но я думаю, что безопасно не иметь ссылку в первую очередь. –

+0

Я согласен, поэтому в моем ответе вам рассказывается, как удалить ссылки с вашего сайта на ваш Дал –

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