2009-02-09 14 views
25

Comencé a aprender sobre DDD y quería saber cómo otros han organizado sus proyectos.¿Cómo organizar un proyecto de diseño impulsado por dominio?

he comenzado fuera de la organización en torno a mis AggregateRoots:

MyApp.Domain (espacio de nombres para el modelo de dominio)

MyApp.Domain.Product
- Producto
- IProductService
- IProductRepository
- etc

MyApp.Domain.Comment
- Comentario
- ICommentService
- ICommentRepository
- etc

MyApp.Infrastructure
- ...

MyApp.Repositories
- ProductRepository: IProductRepository
- etc

El problema con el que he tropezado con esto es que tengo que hacer referencia a mi producto de dominio como MyApp.Domain.Product.Product o Product.Product. También tengo un conflicto con mi modelo de datos linq para el producto .... Tengo que usar líneas feas de código para distinguir entre los dos, como MyApp.Domain.Product.Product y MyApp.Respoitories.Product.

Estoy muy interesado en ver cómo otros han organizado sus soluciones para DDD ...

Estoy utilizando Visual Studio como mi IDE.

Muchas gracias.

Respuesta

19

trato de mantener las cosas muy simple siempre que puedo, por lo general algo como esto funciona para mí:

Myapp.Domain - Todas las clases específicas de dominio comparten este espacio de nombres

Myapp.Data - capa fina que abstrae la base de datos del dominio.

Myapp.Application - Todos "código de soporte", de registro, de código compartido de servicios públicos, los consumidores de servicios, etc

Myapp.Web - La interfaz de usuario web

Así clases serán por ejemplo:

  • Myapp.Domain.Sales.Order
  • Myapp.Domain.Sales.Customer
  • Myapp.Domain.Pricelist
  • Myapp.Data.OrderManager
  • Myapp.Data.CustomerManager
  • Myapp.Application.Utilidades de
  • Myapp.Application.CacheTools

Etc.

La idea que trato de tener en cuenta sobre la marcha es que el espacio de nombres "dominio" es lo que capta la lógica real de la aplicación. Entonces, qué hay allí es con lo que puedes hablar con los "expertos de dominio" (los tipos que usarán la aplicación). Si estoy codificando algo por algo que han mencionado, debe estar en el espacio de nombres de dominio, y cada vez que codigo algo que no han mencionado (como registro, errores de rastreo, etc.) NO debería estar en el espacio de nombres del dominio.

Debido a esto, también soy cauteloso al hacer jerarquías de objetos demasiado complicadas. Idealmente, un esquema algo simplificado del modelo de dominio debería ser intuitivamente comprensible para los no codificadores.

Para este fin, normalmente no comienzo pensando en los patrones con mucho detalle. Intento modelar el dominio de la manera más sencilla posible, siguiendo solo las pautas de diseño orientadas a objetos estándar. ¿Qué necesita ser un objeto? ¿Como están relacionados?

DDD en mi mente se trata de manejar software complejo, pero si su software no es en sí mismo muy complejo para empezar podría terminar fácilmente en una situación en la que la forma de hacer DDD agrega complejidad en lugar de eliminarla.

vez que haya un cierto nivel de complejidad en su modelo que comenzará a ver cómo ciertas cosas deben ser organizado, y entonces sabrán qué patrones de uso, que las clases son agregados etc.

en mi ejemplo , Myapp.Domain.Sales.Order sería una raíz agregada en el sentido de que, cuando se instancia, probablemente contenga otros objetos, como un objeto de cliente y una colección de líneas de orden, y usted solo accederá a las líneas de orden para ese particular orden a través del objeto de orden

Sin embargo, para mantener las cosas simples, no tendría un objeto "maestro" que solo contenga todo lo demás y no tenga otro propósito, por lo que la clase de orden tendrá valores y propiedades útiles en la aplicación.

Así que voy a hacer referencia a cosas como:

Myapp.Domain.Sales.Order.TotalCost

Myapp.Domain.Sales.Order.OrderDate

Myapp.Domain.Sales.Order.Customer .PreferredInvoiceMethod

Myapp.Domain.Sales.Order.Customer.Address.Zip

etc.

+0

Tiene sentido ... Orden y de atención al cliente es que AggRoots ¿verdad? Entonces, cuando hace referencia a su objeto Order, tiene que hacerlo como: Myapp.Domain.Sales.Order.Order ?? –

+0

Sí y no, amplié mi ejemplo un poco, ya que la sección de comentarios es demasiado corta. – Console

+0

Las clases 'Manager' en el espacio de nombres' Data' me recuerdan al modelo anémico –

0

Su dominio probablemente tenga un nombre , por lo que debe usar este nombre como espacio de nombre.

Normalamente puse repositorio de implementación y de acceso a datos datos en un espacio de nombres llamado Persistencia bajo el dominio espacio de nombres.

La aplicación usa su propio nombre como espacio de nombre.

5

me gusta tener el dominio en el espacio de nombres raíz de la aplicación, en su propio conjunto de:

Acme.Core.dll [espacio de nombres raíz: Acme]

Esto representa claramente el hecho de que el dominio está en el alcance de todos otras partes de la aplicación. (Para más información, vea The Onion Architecture por Jeffrey Palermo).

A continuación, tengo un conjunto de datos (generalmente con NHibernate) que mapea los objetos de dominio en la base de datos. Esta capa implementa el repositorio y de servicios interfaces:

Acme.Data.dll [espacio de nombres raíz: Acme.Data]

Entonces, tengo un montaje de presentación elementos de mi IU-patrón de elección declarando:

Acme.Presentation.dll [espacio de nombres raíz : Acme.Presentation]

Finalmente, está el proyecto de la interfaz de usuario (suponiendo que haya una aplicación web aquí). Aquí es donde tiene lugar la composición de los elementos en capas anteriores:

Acme.Web [espacio de nombres raíz: Acme.Web]

0

Me echa un vistazo a CodeCampServer ya que la configuración no es muy común.

Tienen un proyecto central en el que incluyen tanto la aplicación como las capas de dominio. Es decir. el interior de la cebolla (http://jeffreypalermo.com/blog/the-onion-architecture-part-1/).

Realmente me gusta dividir el núcleo en proyectos separados para controlar la dirección de la dependencia. Así que por lo general tengo:

MyNamespace.SomethingWeb < - múltiples interfaces de usuario
MyNamespace.ExtranetWeb < - múltiples interfaces de usuario

MyNamespace.Application < - capa de aplicación de Evans con clases como CustomerService
MyNamespace.Domain

  • MyNamespace.Domain.Model < - entidades
  • MyNamespace.Dom ain.Services < - Servicios Doman
  • MyNamespace.Domain.Repositories

MyNamespace.Infrastructure < - aplicación de recompra etc.

MyNamespace.Common < - Un proyecto que todos los demás proyectos tienen una dependencia a la que tiene cosas como un Logger, clases Util, etc.

3

Aunque también es un desarrollador de .Net, el Java implementation reference of the cargo app de DDD por Eric Evans y Citerus es un buen recurso.

En el código doc'd, puede ver la organización DDD en contextos acotados y agregados en acción, directamente en los paquetes Java.

Además, puede considerar Billy McCafferty's Sharp Architecture. Es una implementación ASP.Net MVC, NHibernate/Fluidez NHibernate que está construida con DDD en mente.

Es cierto que deberá aplicar una solución de carpeta/espacio de nombres para proporcionar los contextos. Pero, combina el enfoque de Evans con #Arch y deberías estar en camino.

Háganos saber a lo que se dirige. Estoy en el mismo camino, ¡y no muy lejos de ti!

codificación feliz,

Kurt Johnson

+0

ACTUALIZACIÓN: Debo añadir que el tenedor Who-Can-Help-Me (WCHM) de Sharp Architecture. A partir de septiembre de 2010, los mantenedores de WCHM se han incluido en el equipo de colaboradores de Sharp. WCHM reorganiza el proyecto de Sharp Visual Studio en carpetas de soluciones que hacen referencia explícita a los conceptos de DDD. Hay carpetas para dominio (dominio e infraestructura específica del dominio), presentación (vistas web y controladores web), marco (código considerado reutilizable en todos los dominios y una capa de servicios (Tareas). Se espera que las versiones futuras de Sharp Architecture reflejen este enfoque. . –

Cuestiones relacionadas