2

У меня очень стандартизированный проект в DDD (Domain-Driven Design), поэтому это означает, что каждый уровень имеет свои обязанности, и ни один уровень не знает кроме себя, а Уровень домена.Как удалить EntityFramework.SqlServer Ссылка из проекта WebApplication в решении DDD

Вот структура моего проекта:

My DDD Project Structure

Infra.Data Мой слой отвечает за соединение с базой данных, и я сохраняющиеся с помощью EntityFramework.

Моя проблема: для того, чтобы заставить его работать с SQLServer базами данных, мне нужно, чтобы добавить ссылку на EntityFramework.SqlServer в моем WebApplication слое, который разрушает мое разделение концепции касается, как вы можете увидеть ниже.

EntityFramework.SqlServer reference in the WebApplication layer (wrong!)

Даже имея ту же ссылку в моем Infra.Data слое, который где он только должен быть, как вы можете увидеть ниже.

Right reference of EntityFramework.SqlServer on the right project

Если я удалить EntityFramework.SqlServer ссылку из WebApplication слоя, он перестает работать, и бросает исключение, каждый раз, когда я пытаюсь сохранять данные, как вы можете увидеть ниже.

Exception generated when trying to persist Data without EntityFramework.SqlServer reference in the WebApplication

Мне нужно знать, как удалить эту ссылку, чтобы сохранить разделение задач, так как это теперь, я должен буду изменить мой WebApplication, если я хочу изменить свою настойчивость. На моем веб-уровне запрещено даже иметь что-либо со словом «EntityFramework». Я хочу, чтобы ПОЛНОЕ разделение проблем меняло любой слой, не влияя ни на что другое.

Если я зарегистрировать <entityFramework> поставщика в моем Web.config файл, он будет работать только если у меня есть EntityFramework.SqlServer в проекте, но без EntityFramework.SqlServer ссылки на WebApplication, это пропустить пространство имен и жаловаться.

Примечание: Мой проект также подключается к MySql баз данных успешно, и я не не нужны никакие ссылки на MySql.Data или любую другую библиотеку MySql в моем WebApplication слое, как и ожидалось.

Пожалуйста, помогите мне, мой DDD/Разделение проблем OCD трескается на нем, спасибо.

ответ

2

Вы можете!

Просто создайте этот класс в вашем проекте Infra.Data:

internal static class ForceEFToCopyDllToOutput 
{ 
    private static SqlProviderServices instance = SqlProviderServices.Instance; 
} 

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

Некоторые считают, что это взломать, но это полезно, если вы хотите, чтобы ваши слои были свободны от проблем с инфраструктурой.

Вы можете прочитать об этом здесь: DLL reference not copying into project bin

EDIT:

Все, что вам теперь нужно, чтобы скопировать строку соединения с вашего Infra.Data app.config к вашему WebApplication web.config

<connectionStrings> 
    <add name="DatabaseConnectionString" providerName="System.Data.SqlClient" connectionString="..." />  
</connectionStrings> 
+0

Спасибо, несмотря на неприглядную природу, это именно то, что мне нужно. –

+0

@EdgarSalazar Добро пожаловать. Если это решит вашу проблему, не забудьте отметить ее как ответ. –

0

Вы не бы быть в состоянии избавиться от конфигурации Entity-рамочный и необходимые DLL в вашем веб-приложения:

  • Допустим, ваш слой инфраструктуры и домен слоя должны зависеть от Entity-рамок , Это означает, что эти две библиотеки должны иметь физический доступ к DLL-библиотекам Entity Framework (иметь установленный пакет Entity Framework) и настроены.
  • При запуске вашего веб-приложения, которое зависит от инфраструктуры и библиотек доменов, все библиотеки DLL, используемые базовыми библиотеками (инфраструктура и домен), должны быть физически настроены и настроены, иначе у вас будет проблема времени выполнения (программа может быть компилируемой но вы получите ошибки времени выполнения).

Мораль истории: если приложение х [Независимо от того слоя он принадлежит] имеет зависимость к библиотеке у, г и библиотеки у, г полагаться на некоторые DLL и требуют настройки для приложения х работать при пробеге вы должны иметь все dll, необходимые для y, z, и предоставить их конфигурацию (web.config) в вашем экземпляре.

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

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