サービス層についてアドバイスが必要です。私がこのモデルを持っているとしましょう:
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
}
Notes と Comments のリポジトリがあるとします。以下は、サービス レイヤーの例です (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 コントローラーを使用できるようにする方法を考えています。唯一の注意点は、エンティティをアプリ レイヤーに公開したくないということです。TDto を使用してドキュメント サービス メソッドを入力し、ある種のファクトリを使用してリポジトリとエンティティ タイプを取り込むという考えがありました。つまり、DTO タイプに基づいて、関連エンティティを検索すると、おそらく switch ステートメントであり、エンティティ タイプとそのリポジトリを起動します。
追加情報: EF 4.1 での私のマッピングは、Note_Attachments と Comment_Attachments のテーブルがあるようなものです。