Frage

Ich brauche einige Ratschläge zu meiner Serviceschicht. Nehmen wir an, ich habe dieses Modell:

    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
    }

Nehmen wir an, ich habe Repositorys für Notizen und Kommentare. Hier ist ein Beispiel für die Serviceschichten (das TDTO repräsentiert die DTOs, die die Entitäten abflachen):

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

Dies funktioniert zwar gut, aber ich habe das Gefühl, dass ich Code in meiner Anwendungsschicht duplizieren würde. Wenn ich also ASP.NET MVC verwendete, habe ich möglicherweise einen Kommentarcontroller und einen Notizcontroller. Ich müsste Methoden zum Erstellen von Anhängen an jedem Controller erstellen.

Ich versuche mir einen Weg zu finden, um den Dokumentendienst zu trennen, damit ich einen Dokumentcontroller haben kann. Die einzige Einschränkung ist, dass ich meine Entitäten nicht der App -Ebene aussetzen möchte. Ein Gedanke, den wir hatten, war es, die Dokumentdienstmethoden in das TDTO einzugeben und eine Art Fabrik zu verwenden, um das Repository- und Entitätstypen einzuziehen. Bedeutung, basierend auf dem DTO-Typ, den wir suchen, wenn die zugehörige Entität vielleicht eine Switch-Anweisung ist und Starten Sie den Entitätstyp und das Repository dafür.

Zusätzliche Information:Meine Zuordnungen in EF 4.1 sind so, dass es eine Tabelle für Note_attachments und comment_attachments gibt.

War es hilfreich?

Lösung

Was ich am Ende gemacht habe, war eine Servicefabrik, um den gewünschten Service zu erhalten. Ich habe meinem IdocumentService auch ein Genrika hinzugefügt. Ich benutze einen Einheitsbehälter. Etwas wie das:

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

Ich habe noch etwas Refactoring zu tun, aber dies zumindest meine Serviceschicht aus der App ein wenig abstrahiert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top