Domanda

Ho bisogno di qualche consiglio sul mio livello di servizio. Diciamo che ho questo modello:

    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
    }

Diciamo che ho repository per note e commenti. Ecco un esempio dei livelli di servizio (il TDTO rappresenta i DTOS che appiattiscono le entità):

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)
        {
            .....
        }
}

Mentre funziona bene, mi sento come se sarei duplicando il codice nel mio livello di applicazione. Quindi, se stavo usando ASP.NET MVC, potrei avere un controller di commento e un controller di nota. Dovrei creare metodi per la creazione di allegati su ciascun controller.

Sto cercando di pensare a un modo per separare il servizio di documenti in modo da poter avere un controller di documenti. L'unica avvertimento è che non voglio esporre le mie entità al livello dell'app. Un pensiero che avevamo era di digitare i metodi di servizio del documento con il TDTO e utilizzare una sorta di fabbrica per attirare il repository e i tipi di entità. Significato, in base al tipo DTO che avremmo cercato l'entità correlata è forse una dichiarazione switch e Accendi il tipo di entità e il repository per esso.

Informazioni aggiuntive:Le mie mappature in EF 4.1 sono tali che esiste una tabella per Note_Attachments e Comment_Attachments.

È stato utile?

Soluzione

Quello che ho finito per fare è stato utilizzare una fabbrica di servizi per ottenere il servizio che volevo. Ho anche aggiunto un genric al mio idocumentservice. Sto usando un contenitore di unità. Qualcosa come questo:

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;
        }
    }

Ho qualche refactoring più da fare, ma questo, almeno, estrae un po 'il mio livello di servizio dall'app.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top