Помогите с Common Service Layer (Использование EF 4.1) для определенных типов объектов? - PullRequest
0 голосов
/ 08 сентября 2011

Мне нужен совет по поводу моего уровня обслуживания. Допустим, у меня есть эта модель:

    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
    }

Допустим, у меня есть хранилища для заметок и комментариев. Вот пример уровней обслуживания (TDto представляет DTO, которые выравнивают объекты):

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

Хотя это работает нормально, я чувствую, что буду дублировать код на своем прикладном уровне. Итак, если бы я использовал Asp.Net MVC, у меня может быть контроллер комментариев и контроллер заметок. Мне бы пришлось создавать методы для создания вложений на каждом контроллере.

Я пытаюсь придумать, как отделить службу Document, чтобы у меня был контроллер Document. Единственное предостережение в том, что я не хочу показывать свои сущности на уровне приложения. Одна мысль, которую мы имели, заключалась в том, чтобы напечатать методы Document Service с помощью TDto и использовать какую-то фабрику для извлечения типов хранилища и сущностей. То есть, основываясь на типе DTO, мы бы посмотрели, что связанная сущность является оператором switch и запустите тип объекта и хранилище для него.

Дополнительная информация: Мои отображения в EF 4.1 таковы, что есть таблица для Note_Attachments и Comment_Attachments.

1 Ответ

0 голосов
/ 09 сентября 2011

В итоге я использовал фабрику сервисов, чтобы получить сервис, который хотел. Я также добавил родословную в свой IDocumentService. Я использую контейнер Unity. Примерно так:

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

У меня есть еще кое-какой рефакторинг, но это, по крайней мере, немного отвлекает мой сервисный слой от приложения.

...