2013-09-15 2 views
0

Я следую за книгой для модели Driven Driven в C# .NEt. У меня есть циклическая зависимость между инфраструктурой и уровнем домена (оба - проект библиотеки классов моего решения, а именно «ShareManagement»). Я хочу знать, как я могу избавиться от проблемы циклической зависимости в Visual Studio/C# .NET.Циклическая зависимость между инфраструктурой и слоями моделей/проектами DDD

  1. Зависимость модели от инфраструктуры слоя: Определенно, Домен Слой использует инфраструктуру слой таким образом, чтобы объекты в модели слое зависит (вызовы) объектов в инфраструктуре слое (например, Хранилище, определенное в инфраструктуре слое доступны из домена модель слоя, используя ICompanyRepository, который реализует IRepository, определенный в уровне инфраструктуры).

  2. Зависимость от инфраструктуры на класс Domain Model: Однако в инфраструктуре слоя, мой Entity Framework (Entity Factory) необходимо реализовать IEntityFactory где Т EntityBase (класс Entity в Domain Model Layer, полученного из EntityBase в Infrascture слоя; EntityBase - это базовый класс для всех объектов).

// Ниже приводится класс в infrasture слое (в разделе «Хранилища» папка)

using System.Text; 
using System.Data; 
using ShareManagement.Model.Company; // How to do this ?? 
ShareManagement.Infrastructure.EntityFactoryFramework; 

namespace ShareManagement.Infrastructure.Repositories 
{ 
    internal class CompanyFactory: IEntityFactory<Company> 
//Company is defined in Model Layer and derived from Abstract Base class "EntityBase" 
//So, how to use "using ShareManagement.Model.Company" ? 
    { 


    } 
} 
+0

Строго говоря, домен не должен зависеть от какой-либо инфраструктуры или служб уровня приложения. Может быть, статья [луковая архитектура] (http://jeffreypalermo.com/blog/the-onion-architecture-part-1/) станет хорошей ссылкой для этого. –

+0

Как вы можете сказать, что когда слой модели домена содержит классы сущностей, все из которых получены из общего базового класса «EntityBase», который определен в слое InfraStructure и, согласно моим знаниям, для декалирования «с использованием myProjectName.Infrastructure.DomainBase»; в слое модели домена мы должны добавить ссылку/зависимость в проекте уровня модели домена в уровень инфраструктуры. Смотрите ниже код, в котором я должен использовать пространство имен ( с использованием системы; использованием SmartCA.Infrastructure.DomainBase, использованием SmartCA.Model.Companies; пространства имен SmartCA.Model.Projects { общественного класса договора: EntityBase { –

+0

Снова, строго говоря, сущности не должны выводиться из базового класса (если вы не моделируете отношения, требующие наследования). Вы также просмотрели статьи, которые я связал? –

ответ

0

изображение, показанном в ссылке ниже имеет две сборки/проектов (заключено в двух основных границах), названным в качестве инфраструктуры Проектирование/сборка слоя и выборка слоя.

Как видно из рисунка, оба они образуют круговую зависимость. http://screencast.com/t/lUGwetETXHF

Решение по этому вопросу представлена ​​на ссылку ниже: http://screencast.com/t/acsLjq7Ubd

Если проект/блок А (модель в нашем случае) зависит от (ссылки) Проект/Сборка B (инфраструктура в нашем случае), и если «часть» Сборка B (например, инфраструктура.Repositories OR EntityFactory) зависит от классов (; должна ссылаться) в проекте/сборке A (модели), образующей круговую зависимость, затем разрешает эту зависимость, как показано ниже:

Для понимания, Назовите зависимую «Часть «Код» в сборке B как B-dep1, тогда;

  1. Сделать B-dep1 отдельной сборкой/проектом из B ShareManagement.Infrastructure.Repositories.

  2. Название нового проекта для B-dep1 должно быть тем же именем пространства имен, что и в слое в проекте B, так что B-dep1 остается частью пространства Layer/Namespace (я имею в виду, что он остается частью ShareManagement .Infrastructure namespace) в Assembly/Project B. (В нашем случае я назвал этот новый проект для B-dep1 как ShareManagement.Infrastructure.Repositories.

  3. Теперь новый проект для B-dep1, а именно «ShareManagement.Infrastructure. Хранилища "могут ссылаться на A без формирования круговой зависимости.

См. How:

новый проект для B-dep1, а именно «ShareManagement.Infrastructure.Repositories» зависит от A. на B, но B не зависит от (ссылки) проекта New-Part.

А зависит от Б, но Б не зависит от нового проекта для B-dep1 именно «ShareManagement.Infrastructure.Repositories» тогда проект ShareManagement.Infrastructure.Repositories все еще может продолжать использовать пространство имен (и инкапсулированный код) инфраструктур Layer без необходимости добавлять ссылку на код инфраструктуры, поскольку они имеют одинаковые пространства имен (именно поэтому я назвал проект в соответствии с пространством имен в B Project). Visual studio автоматически создает пространство имен на основе имени проекта или имени папки. Те же пространства имен в разных assmblies освободили сборки, чтобы ссылаться друг на друга, как в этом случае пространства имен, связанные с уровнем Infrascture.

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