0

サービス層についてアドバイスが必要です。私がこのモデルを持っているとしましょう:

    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 のテーブルがあるようなものです。

4

1 に答える 1

0

私が最終的にやったのは、サービスファクトリを使用して、必要なサービスを取得することでした。また、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;
        }
    }

もう少しリファクタリングを行う必要がありますが、これにより、少なくともサービス レイヤーがアプリから少し抽象化されます。

于 2011-09-09T00:56:35.163 に答える