He leído algunas de las preguntas sobre los modelos de dominio anémico y la separación de las preocupaciones. ¿Cuáles son las mejores técnicas para realizar/adjuntar lógica de dominio en objetos de dominio anémicos? En mi trabajo, tenemos un modelo bastante anémico, y actualmente estamos usando clases de "ayuda" para realizar la lógica de la base de datos/negocios en los objetos del dominio. Por ejemplo:Técnicas para tratar el modelo de dominio anémico
public class Customer
{
public string Name {get;set;}
public string Address {get;set;}
}
public class Product
{
public string Name {get;set;}
public decimal Price {get;set;}
}
public class StoreHelper
{
public void PurchaseProduct(Customer c, Product p)
{
// Lookup Customer and Product in db
// Create records for purchase
// etc.
}
}
Cuando la aplicación tiene que hacer una compra, que crearía la StoreHelper, y llame al método de los objetos de dominio. Para mí, tendría sentido que el Cliente/Producto supiera cómo guardarse en un repositorio, pero probablemente no desee los métodos Save() en los objetos del dominio. También tendría sentido para un método como Customer.Purchase (Product), pero eso es poner lógica de dominio en la entidad.
Estas son algunas de las técnicas que he encontrado, no estoy seguro, que son bueno/malo:
- cliente y producto heredan de una clase de "Entidad", que proporciona las operaciones CRUD básicas de una forma genérica (usando un ORM tal vez).
- Pros: Cada objeto de datos recibirá automáticamente las operaciones CRUD, pero luego se atan a la base de datos/ORM
- Contras: Esto no resuelve el problema de las operaciones comerciales en los objetos, y también se vincula todos los objetos de dominio a una entidad de base que podría no ser apropiada
- clases de uso auxiliar para manejar las operaciones CRUD y la lógica de negocio
- ¿tiene sentido tener DAOs para las "bases de datos puros" operaciones y ayudantes de negocio independientes para ellos ¿operaciones comerciales específicas del mineral?
- ¿Es mejor utilizar clases auxiliares no estáticas o estáticas para esto?
- Pros: objetos de dominio no están vinculados a ninguna lógica de la base de datos/negocio (completamente anémica)
- Contras: no es muy OO, no muy natural utilizar ayudantes en el código de aplicación (se parece a código C)
- utilice la técnica de doble Despacho, donde la entidad tiene métodos para salvar a un repositorio arbitraria
- Pros: mejor separación de las
- Contras: las entidades tienen cierta lógica adicional adjunto (aunque está desacoplado)
- En C# 3.0, puede utilizar los métodos de extensión para unir los métodos CRUD/negocio a un objeto de dominio sin tocarlo
- Es este un enfoque válido? ¿Cuáles son los pros/contras?
- ¿Otras técnicas?
¿Cuáles son las mejores técnicas para manejar esto? Soy bastante nuevo en DDD (estoy leyendo el libro de Evans, así que tal vez eso me abra los ojos)
Parece un montón de diferentes clases solo para manejar un cliente. ¿Por qué no lanzar la mayor parte en una sola clase, con un servicio para manejar cualquier cosa compleja? –
Mi respuesta es vieja como el infierno. : D –
@LuckyLindy Principalmente porque DDD se trata de crear un puente entre expertos de dominio y programadores. El modelo de dominio no debe contener material técnico, de lo contrario el lenguaje ubicuo no podrá existir. Para mover cosas técnicas, debemos abstraerlo. Resumiendo algo siempre se infla la base de códigos. –