Некоторые вопросы о структурировании доменных имен

У меня есть некоторые общие вопросы о дизайне фреймворка.

Я создаю API для приложения iPhone в С#.NET(фреймворк 3.5) и SQL 2008 (используя LINQ). Я следил за шаблоном управления доменом (в книге) и имеют следующую структуру папок:

Core
- DataAccess
--Impl
-Domain
-Impl

Core - это моя основная библиотека API - мои DLL. DataAccess содержит интерфейсы доступа к данным DataAccess.Impl содержит репозитории (LINQ для БД) Домен содержит большинство моих типов данных и свойств. Impl содержит мои услуги (например AccountService.cs, EmailService.cs)

Теперь, в качестве упражнения, я добавил службу Windows в этот проект и я пытаюсь вызвать функциональность из DLL в этой службе. МОЙ ВОПРОС: какой слой я должен показывать другим приложениям? и что должно оставаться скрытым?

  • Должны ли классы обслуживания из папки Impl быть видными программистами?
  • Или репозитории из DataAccess.Impl?
  • Или, должен ли я просто заложить все это для программистов? Как выглядит теперь это кажется путаным.

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

Мой другой вопрос связан с именами имен пространства имен. Когда служба Windows звонит функциональность из моей основной библиотеки, я должен делать свои предложения как таковые:

using Company.Product.ProductCore.Core.DataAccess.Impl 
using Company.Product.ProductCore.Core.Domain 
using Company.Product.ProductCore.Core.Impl

Это кажется многословным. Глядя на библиотеки DLL Microsoft, они, похоже, придерживаются двухуровневой соглашение - (System.Linq, System.Text и т.д.). Имея Company.Product.ProductCore.Core.Impl кажется беспорядочным и на самом деле не говорит программисту, что делает это пространство имен (но это это то, что было предложено на примере, который я читал). Здесь есть лучшая практика?

Ваши предложения (и любые примеры) серьезно оценены.

Спасибо.

Ответ 1

Домен, безусловно, не тот, который вы ищете, на мой взгляд, ни один из ваших уровней доступа к данным.

По моему скромному мнению, то, что должно быть выставлено, еще не существует, то есть статический класс, допустим, если мы рассмотрим шаблон-шаблон Facçade, который раскрывает функции и функции вашей библиотечной подсистемы.

alt text

Образец шаблона фасада объясняется:

Итак, в конце концов, что должен делать ваш код? Просто расскажите, что необходимо, что вы должны знать, поскольку вы единственный, кто знает о вашей системе.

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

По моему мнению, этот фасад выставляет автомобили, которые вы сможете купить, брать деньги на покупку, ремонтировать автомобиль, покупать другие сопутствующие аксессуары и т.д. Затем аксессуары должны быть выставлены, но только то, что нуждается в. То же самое с другими вещами, такими как автомобиль. То есть, вы можете захотеть разоблачить только интерфейс и сохранить реализацию для себя, чтобы через ваш фасад, когда вам нужно вернуть ICar или IAccessory, вы должны создать их через класс объектов реализации, затем верните экземпляр интерфейса через ваш фасад. Тем не менее, пользователю не нужно знать, что происходит под капотом, но только если он хочет автомобиль, он должен заказать его через ваш фасад. Так же, как вы не пойдете купить Mazda 3 для Mercedes Benz. Вы будете работать с правильным фасадом. Опять же, разные автодилеры могут быть только подсистемами, отсюда и какие-то заводы. Затем вы спрашиваете фасад автомобиля с этой и той спецификацией, и фасад должен знать, что экземпляр ICar вернется, чтобы обменять то, о чем вы просите его предоставить.

Надеюсь, это поможет! =)

Ответ 2

Если я не ошибаюсь, вы задаете два вопроса:

  • Как структурировать приложение DDD?
  • Как насчет этих длинных имен пространства имен?

Мой ответ довольно длинный - я взял на себя смелость разделить его на двух андерсеров.

Это ответ на второй вопрос:

2. Как насчет этих длинных имен пространства имен

Я не думаю, что длинные имена пространства имен обязательно беспорядочны. ИМХО, что выглядит грязно в ваших именах:

  • повторение слов "Продукт" и "Ядро"
  • Использование общего термина "Impl"

Первым улучшением может быть:

// The Domain objects go here;
MyCompany.MyProduct.Core.Domain;  
// DataAccess interfaces go here:
MyCompany.MyProduct.Core.DataAccess;
// a Linq implementation of the DataAcces interfaces go here:
MyCompany.MyProduct.Core.DataAccess.LinqImpl; 
// The Core service go here:
MyCompany.MyProduct.Core.Services;
// Some general purpose infrastructure goes here (e.g. emailing code)
Mycompany.MyProduct.Infra;

Кроме того, я считаю, что использование коммерческого названия продукта (например, MyProduct) в структуре кода плохое (что, если маркетинг выбирает другое имя?); Вместо этого мне нравится использовать логические подсистемы. Предположим, что ваша система аренды автомобиля. Тогда CarRental будет считаться основной функциональностью этого приложения. Затем я бы использовал следующую структуру пространства имен (Serra - это название моей компании):

// For classes Customer, Account, Car
Serra.CarRental.Domain;    
// I use Dao as a general abbreviation for "Data Access Objects"
// Dao interfaces go here:
Serra.CarRental.Dao;     
// Linq implementation for Dao interfaces  
Serra.CarRental.Dao.Linq;
// For Services specific to the car rental domain: 
// AccountService and RentalService and CarAvailabilityService
Serra.CarRental.Services;  
// For UI objects (not relevant in you situation?)
Serra.CarRental.UI;
// general service code; ignorant of the CarRental domain (e.g. an EmailService)
Serra.Infra.Service;       

Ответ 3

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

Также вам нужно как можно меньше снизить расходы на обслуживание. И вот, как ваш код организован. Второе - минимизировать расходы на техническое обслуживание.

Итак, чтобы решить, как организовать свое решение, вы должны ответить на несколько вопросов:

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

Это ваши цели. Но не правила, которые вы ищете. Вы можете выбрать любые имена, если новый разработчик их поймет.

Вероятно (в качестве эвристики, и если вы используете некоторые инструменты рефакторинга, такие как Resharper или Refactor! Pro), вы можете начать с единого пространства сборки и одного имени. Во время разработки вы увидите, как вы можете изменить структуру своего проекта, чтобы лучше удовлетворить ваши потребности. Затем реорганизуйте его.

Идите смотреть talk в 38: 18-39: 45 (~ 1,5 минуты). Есть хорошая практика о том, как ответить на некоторые вопросы.