9

В настоящее время я использую Autofac для IoC и двух корней композиции (один для интерфейсного и один для внутреннего). Я регистрирую и разрешаю компоненты, натянутые на Service, Business и Data слоев.Модули Autofac в архитектуре N-уровня

На данный момент у меня есть один такой, как «AccountingModule». Теперь я собираюсь добавить в приложение несколько новых модулей с таким именем, как InventoryModule, ...

Мой вопрос: должен ли я разделять классы модулей среди слоев (решение 1) или иметь все уровни отдельно для каждого модуль (Раствор 2)

Раствор 1:

Service Layer 

(AccountingMoudle, InventoryModule, ...) 

Business Layer 

(AccountingMoudle, InventoryModule, ...) 

Data Layer 

(AccountingModule, InventoryModule, ...) 

или

Раствор 2:

AccountingModule 
(
Service Layer, 
Business Layer, 
Data Layer 
) 

InventoryModule 
(
Service Layer, 
Business Layer, 
Data Layer 
) 

Редактировать 1

+-----------------------------+        +----------------------------+ 
+--+AccountingServiceComponent        +-+InventoryServiceComponent 
|          Weak Dependency  | 
+--+AccountingBusinessComponent  <------------------+ +-+InventoryBusinessComponent 
|               | 
+--+AccountingDataComponent         +-+InventoryDataComponent 
     +               + 
     +-+ GetDocumentByID(int id)        +--+GetProductByID(int id) 
     |               | 
     +-+ SaveDocument(Document d)        +--+SaveProduct(Product p) 

Edit 2 Архитектура:

enter image description here

+5

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

+0

Связанный: https://stackoverflow.com/questions/9501604/ioc-di-why-do-i-have-to-reference-all-layers-assemblies-in-entry-application – Steven

ответ

4

В настоящее время я использую Autofac для IoC и двух корней состава (один для переднего плана и один для заднего плана)

Я понимаю, что это всего лишь одно приложение, имеющее интерфейсные и задние части. Прежде всего, у вас должен быть один корень композиции или ваш дизайн в какой-то момент сработает. Неважно, какое решение у вас есть.

Давайте предположим, что это два разных приложения-драйвера (например, веб-сервис и веб-сайт).

Мой вопрос я должен разделить каждый классы модулей между слоями (раствор 1) или иметь все слои отдельно для каждого модуля (решение 2)

Edit: На самом деле ваш вопрос «Горизонтальные (решение 1) или вертикальные (решение 2) срезы лучше?» (Partition Your Application into Modules)

Эта статья Horizontal vs Vertical slicing объясняет это хорошо.И он говорит:

Идите вертикально, когда сможете. И горизонтально, когда вы тоже.

Вот еще один хороший article

После правки, я вижу, вы уже реализовали свои модули, как вертикально, так идти по вертикали (раствор 2).

+0

Предполагая, что A & B является нашими модулями , не могли бы вы сказать, как он отличается от решения 1? В моем решении 1 различные части данного модуля размещаются на соответствующем уровне и доступны в стандартном сервисе, бизнесе, заказе данных. –

+0

Я добавил диаграмму классов. Я сомневаюсь в значении модуля в вашем ответе. Здесь по модулю я имею в виду набор связанных классов с сильными зависимостями между собой и слабой зависимостью от других частей приложения. На моей диаграмме их всего две, на самом деле может быть более 10 или более модулей. –

+0

Я заключил с предложенной диаграммой. Теперь в терминах Autofac, Должен ли я регистрировать все подслои субдомена (InventoryUIComponent, InventoryServiceComponent, InventoryBusinessComponent, InventoryDataComponent) в качестве единого InventoryModule? В будущем может быть больше таких поддоменов, и большинство из них могут быть необязательными для конечных пользователей. –

1

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

If you have multiple composition roots, then you should create the modules in each one. There is a good chance that different composition roots might use different modules. Further you probably don't want to add Autofac as a reference to every library in your solution..

Мой вопрос я должен разделить каждые классы модулей между слоями (раствор 1) или иметь все слои отдельно для каждого модуля (решение 2)

зависит от количества регистраций, если это очень небольшое число, то вы могли бы просто использовать AccountingModule и InventoryModule.

Если в бухгалтерском учете имеется много регистраций, но небольшое количество в инвентаре, вы можете получить AccountingServiceModule, AccountingBusinessModule, AccountingDataModule и InventoryModule. Вы можете начать с одного модуля для каждого домена (инвентаря, учетной записи и т. Д.) Приложения и разделить их по мере необходимости.

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