Pregunta

Necesito algunos consejos sobre mi capa de servicio. Digamos que tengo este modelo:

    public abstract class Entity
    {
         public Guid Id {get;set;}
    }

    public abstract class Document: Entity
    {
           public virtual ICollection<Attachment> Attachments{get;set;}
    }

    public class Attachment: Entity
    {
          Guid ParentEntityId {get;set;}        
          //some props....
    }

    public class Note: Document
    {
         //some props
    }

    public class Comment: Document
    {
        //some props
    }

Digamos que tengo repositorios para notas y comentarios. Aquí hay un ejemplo de las capas de servicio (el TDTO representa los DTO que aplanan las entidades):

public interface IMainService<TDto>
{
     TDto Create(TDto dto);
     void Update(TDto dto);
     void Delete(Guid, Id);
}

public interface IDocumentService
{
    AttachmentDto AddNewAttachment(AttachmentDto dto);

}

public abstract DocumentService<TEntity>: IDocumentService
{
        private IRepository<TEntity> _repository;
        public DocumentService(IRepository<TEntity> repository)
        {
             _repository = repository
        }

        AttachmentDto AddNewAttachment(AttachmentDto dto)
        {
        var entity = _repository.GetById(dto.ParentId);

        //attachment code
        _repository.Update(entity)
        _repository.UoW.Commit();
        .....
}


public class NoteService: DocumentService<Note>, IMainServcie<NoteDto>
{
        public NoteService(INoteRepository repository): base(repository)
        {
            .....
        }
}

public class CommentService: DocumentService<Comment>, IMainServcie<CommentDto>
{
        public NoteService(INoteRepository repository): base(repository)
        {
            .....
        }
}

Si bien esto funciona bien, siento que estaría duplicando el código en mi capa de aplicación. Entonces, si estaba usando ASP.NET MVC, puedo tener un controlador de comentarios y un controlador de notas. Tendría que crear métodos para crear archivos adjuntos en cada controlador.

Estoy tratando de pensar en una forma de separar el servicio de documentos para poder tener un controlador de documentos. La única advertencia es que no quiero exponer mis entidades a la capa de la aplicación. Un pensamiento que teníamos era escribir los métodos de servicio de documentos con el TDTO y usar algún tipo de fábrica para extraer el repositorio y los tipos de entidad. Significado, basado en el tipo DTO, buscaríamos la entidad relacionada es quizás una declaración de conmutador y Enciende el tipo de entidad y el repositorio para ello.

Información Adicional:Mis asignaciones en EF 4.1 son tales que hay una tabla para nota_attachments y comment_attachments.

¿Fue útil?

Solución

Lo que terminé haciendo fue usar una fábrica de servicios para obtener el servicio que quería. También agregué un Genric a mi Idocumentservice. Estoy usando un contenedor de unidad. Algo como esto:

public static class ServiceFactory
    {
        public static Services.IDocumentService<TDto> GetDocumentService<TDto>() where TDto : IBridgeDto
        {
            var dtoName = typeof(TDto).Name;
            IDocumentService<TDto> retrunService = null;
            switch (dtoName)
            {
                case "NoteDto":
                    retrunService = (IDocumentService<TDto>) container.Resolve<INoteService>();
                    break;
            }

            return retrunService;
        }
    }

Tengo un poco más de refactorización que hacer, pero esto, al menos, abstrae un poco mi capa de servicio de la aplicación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top