7

He estado estudiando arquitectura de cebolla por un par de días. Entiendo que las dependencias siempre deben ir hacia el centro y cómo usar la inyección de dependencia para lograr esto. Pero tengo un par de preguntas que aún no pude descifrar.cómo implementar servicios y repositorios en arquitectura de cebolla?

  1. ¿Puede un modelo (o entidad) hacer referencia a una interfaz de repositorio o una interfaz de servicio?

    Por ejemplo: una entidad Order tiene una relación establecida a través de DeliveryCityOder.DeliveryZip propiedad, que es no una clave externa, pero es único. Para llegar a la Ciudad por una cremallera, debo llamar ICityRepository.FindByZip(zip)

    Tengo el siguiente código en mi modelo

    class Order 
    { 
        . . . 
    
        [Inject] 
        public ICityRepository CityRepository { get; set; } 
    
        private City _dCity; 
    
        public City DeliveryCity { 
         get { 
          if (_dCity == null) 
           _dCity = this.CityRepository.FindByZip(this.DeliveryZip); 
    
          return _dCity; 
         } 
        } 
        . . . 
    } 
    
  2. ¿Cuáles serían los problemas del código anterior? ¿Debería usar un servicio de dominio en su lugar?

  3. ¿Deben definirse las implementaciones de servicios de dominio dentro del núcleo o en la capa de infraestructura?

Respuesta

5

Aquí es donde entran las fábricas en el dominio. Un OrderFactory puede tomar dependencias, como una dependencia en el IOrderRepository, así como una dependencia en ICityRepository. Cuando la fábrica se utiliza para crear (o reconstituir) una entidad de pedido, la fábrica puede buscar la ciudad y establecer la propiedad de pedido en consecuencia. O, como sugiere Herzmeister, configúralo usando Lazy para que la búsqueda solo se realice si es necesario.

+0

¡Tiene perfecto sentido! Me pregunto "¿cómo podría extrañar eso?" ¡Gracias! – svallory

+1

Esto es un error. La fábrica de DDD no es responsable de la reconstitución. Reconsitución es la vida media de un objeto. Factory solo se preocupa por el comienzo de la vida. Por favor, consulte esta respuesta: http://stackoverflow.com/a/10264669/625332 – Dmitry

+0

No estoy de acuerdo. Las fábricas se utilizan para crear instancias de un objeto. Pueden estar al comienzo del ciclo de vida de un objeto o usarse para la reconstitución. Pueden ser la misma clase con dos métodos o dos clases diferentes. De cualquier manera, estoy de acuerdo en que hay una diferencia en cómo se comporta la fábrica en cada caso. Normalmente tengo la fábrica de reconstitución como una dependencia del repositorio que delega en la fábrica para crear y reconstituir la nueva instancia con los datos recuperados del almacén de datos. Para obtener más información, vea Evans pg 145: "Reconstitución de objetos almacenados" – SonOfPirate

5

¿Cuáles serían los problemas del código anterior? ¿Debería usar un servicio de dominio en su lugar?

dos cosas a considerar aquí:

  1. ICityRepository no es una verdadera dependencia de la Orden, en otras palabras, la Orden no lo necesita para sus otros métodos. La dependencia real es algo que el objeto no puede funcionar sin él. Por lo tanto, es posible que desee considerar pasarlo como un parámetro al método como 'GetDeliveryCity' (consulte this para obtener más información).

  2. Buscar ciudad por código postal no parece ser una responsabilidad del pedido. Para que el pedido sea cohesive, solo tiene que tratar las funciones relacionadas con los pedidos. Es posible que desee sacar esta funcionalidad de la clase de orden.

caso de que las implementaciones de servicios de dominio puede definir el interior del núcleo o en la capa de infraestructura?

Dentro del núcleo si se trata realmente de un servicio de dominio (no servicio de aplicación).

0
  1. ¿Qué tal

    private Lazy<City> _dCityLazy; 
    
    public City DeliveryCity { 
        get { 
         return _dCityLazy.Value; 
        } 
    } 
    

    el lugar donde quiere inyecta el Lazy<City> por algún mecanismo?

  2. Usted decidiría flexiblemente mediante inyección desde el exterior y luego en este ejemplo.

  3. Yo diría que realmente depende de qué servicio de un dominio en particular y dónde se utiliza.

+0

Inyectar la ciudad a través de un IoC llevaría a agregar reglas comerciales al inyector de dependencia, lo cual es realmente malo. No estoy seguro de que sea eso lo que propusiste. – svallory

+0

por supuesto, las reglas de negocio en el inyector de dependencia son realmente malas, pero no tiene por qué ser así. Hay muchas otras posibilidades. Puede haber un servicio de dominio en el medio. O bien, las búsquedas simples de identificación son obviamente el trabajo de un repositorio, que lleva el método real desde el que se hará referencia al delegado para el 'Lazy '. En general, me gusta mantener mis entidades simples, es decir, sin ningún conocimiento de la estructura de la persistencia real, es decir, sin ninguna referencia a servicios o repositorios. – herzmeister

Cuestiones relacionadas