Помощь с общим уровнем обслуживания (с использованием EF 4.1) для определенных типов объектов?

StackOverflow https://stackoverflow.com/questions/7350472

Вопрос

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

    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 представляет DTOS, которые сглаживают сущности):

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, у меня может быть контроллер комментариев и контроллер заметок. Я должен был бы создать методы создания вложений на каждом контроллере.

Я пытаюсь придумать способ отделить службу документов, чтобы у меня был контроллер документа. Единственное предостережение заключается в том, что я не хочу выставлять свои сущности на слой приложения. Одна из них думал, что мы должны были ввести методы службы документов с TDTO и использовать какую-то заводскую завод, чтобы привлечь типы репозитория и объектов. Запустите тип сущности и репозиторий для него.

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

Это было полезно?

Решение

То, что я закончил, это использовал сервисную фабрику, чтобы получить услугу, которую я хотел. Я также добавил Genric в свой IdocumentService. Я использую контейнер единства. Что-то вроде этого:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top