Мне нужен совет по поводу моего уровня обслуживания. Допустим, у меня есть эта модель:
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.