Question

J'ai besoin des conseils sur ma couche de service. Disons que j'ai ce modèle:

    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
    }

Le mot Let je les dépôts pour Notes et commentaires. Voici un exemple des couches de service (le TDTO représente les DTO qui aplatissent les entités):

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

Bien que cela fonctionne très bien, je me sens comme si je serais Duplication code dans ma couche d'application. Donc, si j'utilisais Asp.Net MVC je peux avoir un contrôleur de commentaire et un contrôleur de note. Je dois créer des méthodes pour créer des pièces jointes sur chaque contrôleur.

Je suis en train de penser à un moyen de séparer le service de document pour que je puisse avoir un contrôleur de document. La seule réserve est que je ne veux pas exposer mes entités à la couche d'application. On croyait que nous avions était de taper les méthodes de service de document avec le TDTO et utiliser une sorte d'usine pour tirer les types de dépôt et de l'entité dans. Signification, en fonction du type DTO nous Recherch l'entité associée est peut-être une instruction switch et feu le type d'entité et un référentiel pour elle.

Informations complémentaires: Mes applications dans EF 4.1 sont telles qu'il ya une table pour Note_Attachments et Comment_Attachments.

Était-ce utile?

La solution

Ce que je fini par faire utilisait une usine de service pour obtenir le service que je voulais. J'ai aussi ajouté un genric à mon IDocumentService. J'utilise un récipient unité. Quelque chose comme ceci:

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

J'ai un peu plus refactorisation à faire, mais, au moins, résumés ma couche de service de l'application un peu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top