Domain driven design DDD中的工厂、服务、存储库

Domain driven design DDD中的工厂、服务、存储库,domain-driven-design,factory-pattern,ddd-repositories,ddd-service,Domain Driven Design,Factory Pattern,Ddd Repositories,Ddd Service,我对DDD中的工厂、存储库和服务有一些问题。我有以下实体:文件夹、文件、文件数据 我认为“文件夹”是一个聚合根目录,应该负责创建文件和FileData对象 所以我的第一个问题是,我应该使用工厂来创建这个aggreate,还是由存储库来创建?现在我有两个存储库,一个用于文件夹,另一个用于文件,但在我看来,我应该将它们合并在一起。下面的代码片段显示了我的文件夹存储库,它位于我的基础结构层中: public class FolderRepository : IFolderRepository {

我对DDD中的工厂存储库服务有一些问题。我有以下实体:文件夹、文件、文件数据

我认为“文件夹”是一个聚合根目录,应该负责创建文件和FileData对象

所以我的第一个问题是,我应该使用工厂来创建这个aggreate,还是由存储库来创建?现在我有两个存储库,一个用于文件夹,另一个用于文件,但在我看来,我应该将它们合并在一起。下面的代码片段显示了我的文件夹存储库,它位于我的基础结构层中:

public class FolderRepository : IFolderRepository
{
    #region Fields

    private readonly IFolderContext _context;
    private readonly IUnitOfWork _unitOfWork;

    #endregion

    #region Constructor

    public FolderRepository(IUnitOfWork unitOfWork)
    {
        _unitOfWork = unitOfWork;
        _context = _unitOfWork.Context as IFolderContext;
    }

    #endregion

    public IUnitOfWork UnitOfWork
    {
        get { return _unitOfWork; }
    }

    public IQueryable<Folder> All
    {
        get { return _context.Folders; }
    }

    public Folder Find(Guid id)
    {
        return _context.Folders.Find(id);
    }

    public void InsertGraph(Folder entity)
    {
        _context.Folders.Add(entity);
    }

    public void InsertOrUpdate(Folder entity)
    {
        if (entity.Id == Guid.Empty)
        {
            _context.SetAdd(entity);
        }
        else
        {
            _context.SetModified(entity);
        }
    }

    public bool Delete(Guid id)
    {
        var folder = this.Find(id) ?? _context.Folders.Find(id);
        _context.Folders.Remove(folder);

        return folder == null;
    }

    public int AmountOfFilesIncluded(Folder folder)
    {
        throw new NotImplementedException();
        //return folder.Files.Count();
    }

    public void Dispose()
    {
        _context.Dispose();
    }
}
公共类文件夹存储库:IFolderRepository
{
#区域字段
私有只读IFolderContext\u上下文;
私人只读i工作单元(unitof工作单元);;
#端区
#区域构造函数
公共文件夹存储库(IUnitOfWork unitOfWork)
{
_unitOfWork=unitOfWork;
_context=\u unitOfWork.context作为IFolderContext;
}
#端区
公共工作单位
{
获取{return\u unitOfWork;}
}
公共图书馆
{
获取{return\u context.Folders;}
}
公用文件夹查找(Guid id)
{
返回_context.Folders.Find(id);
}
公共void InsertGraph(文件夹实体)
{
_context.Folders.Add(实体);
}
public void InsertOrUpdate(文件夹实体)
{
if(entity.Id==Guid.Empty)
{
_SetAdd(实体);
}
其他的
{
_context.SetModified(实体);
}
}
公共布尔删除(Guid id)
{
var folder=this.Find(id)??\u context.Folders.Find(id);
_context.Folders.Remove(文件夹);
返回文件夹==null;
}
公共int AmountOfficesIncluded(文件夹)
{
抛出新的NotImplementedException();
//返回folder.Files.Count();
}
公共空间处置()
{
_context.Dispose();
}
}
接下来,我在我的应用层中创建了一个服务,称为“IoService”。我对服务地点有疑问。是否应将其移动到域层

public class IoService : IIoService
{
    #region Fields

    private readonly IFolderRepository _folderRepository;
    private readonly IFileRepository _fileRepository;
    private readonly IUserReferenceRepository _userReferenceRepository;

    #endregion

    #region Constructor

    public IoService(IFolderRepository folderRepository, IFileRepository fileRepository, IUserReferenceRepository userReferenceRepository)
    {
        if(folderRepository == null)
            throw new NullReferenceException("folderRepository");
        if(fileRepository == null)
            throw new NullReferenceException("fileRepository");
        if (userReferenceRepository == null)
            throw new NullReferenceException("userReferenceRepository");

        _folderRepository = folderRepository;
        _fileRepository = fileRepository;
        _userReferenceRepository = userReferenceRepository;
    }

    #endregion

    #region Folder Methods

    /// <summary>
    /// Create a new 'Folder'
    /// </summary>
    /// <param name="userReference"></param>
    /// <param name="name"></param>
    /// <param name="parentFolder"></param>
    /// <param name="userIds">The given users represent who have access to the folder</param>
    /// <param name="keywords"></param>
    /// <param name="share"></param>
    public void AddFolder(UserReference userReference, string name, Folder parentFolder = null, IList<Guid> userIds = null, IEnumerable<string> keywords = null, bool share = false)
    {
        var userReferenceList = new List<UserReference> { userReference };

        if (userIds != null && userIds.Any())
        {
            userReferenceList.AddRange(userIds.Select(id => _userReferenceRepository.Find(id)));
        }

        var folder = new Folder
        {
            Name = name,
            ParentFolder = parentFolder,
            Shared = share,
            Deleted = false,
            CreatedBy = userReference,
            UserReferences = userReferenceList
        };

        if (keywords != null)
        {
            folder.Keywords = keywords.Select(keyword =>
                new Keyword
                {
                    Folder = folder,
                    Type = "web",
                    Value = keyword,
                }).ToList();
        }

        //insert into repository
        _folderRepository.InsertOrUpdate(folder);

        //save
        _folderRepository.UnitOfWork.Save();
    }

    /// <summary>
    /// Get 'Folder' by it's id
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public Folder GetFolder(Guid id)
    {
        return _folderRepository.Find(id);
    }

    #endregion

    #region File Methods

    /// <summary>
    /// Add a new 'File'
    /// </summary>
    /// <param name="userReference"></param>
    /// <param name="folder"></param>
    /// <param name="data"></param>
    /// <param name="name"></param>
    /// <param name="title"></param>
    /// <param name="keywords"></param>
    /// <param name="shared"></param>
    public void AddFile(UserReference userReference, Folder folder, FileData data, string name, string title = "", IEnumerable<string> keywords = null, bool shared = false)
    {
        var file = new File
        {
            Name = name,
            Folder = folder,
            FileData = data,
            CreatedBy = userReference,
            Type = data.Type
        };

        if (keywords != null)
        {
            file.Keywords = keywords.Select(keyword =>
                new Keyword
                {
                    File = file,
                    Type = "web",
                    Value = keyword,
                }).ToList();
        }

        folder.Files.Add(file);
        folder.Updated = DateTime.UtcNow;

        _folderRepository.InsertOrUpdate(folder);

        //save
        _folderRepository.UnitOfWork.Save();
    }

    /// <summary>
    /// Get 'File' by it's id
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public File GetFile(Guid id)
    {
        return _fileRepository.Find(id);
    }

    #endregion
}
public类IoService:IIoService
{
#区域字段
私有只读IFolderRepository\u folderRepository;
专用只读IFileRepository\u文件存储库;
私有只读IUSERReferencePository\u用户引用Pository;
#端区
#区域构造函数
公共IoService(IFolderRepository文件夹存储库、IFolderRepository文件存储库、iUserReferencePository用户引用存储库)
{
如果(folderRepository==null)
抛出新的NullReferenceException(“folderRepository”);
if(fileRepository==null)
抛出新的NullReferenceException(“fileRepository”);
if(userReferencePository==null)
抛出新的NullReferenceException(“UserReferencePository”);
_folderRepository=folderRepository;
_fileRepository=fileRepository;
_UserReferencePository=UserReferencePository;
}
#端区
#区域文件夹方法
/// 
///创建新的“文件夹”
/// 
/// 
/// 
/// 
///给定的用户表示有权访问该文件夹的用户
/// 
/// 
public void AddFolder(UserReference UserReference,字符串名,Folder parentFolder=null,IList userIds=null,IEnumerable keywords=null,bool share=false)
{
var userReferenceList=新列表{userReference};
if(userIds!=null&&userIds.Any())
{
userReferenceList.AddRange(userIds.Select(id=>\u userReferencePository.Find(id));
}
var folder=新文件夹
{
Name=Name,
ParentFolder=ParentFolder,
分享,
已删除=错误,
CreatedBy=userReference,
UserReferences=userReferenceList
};
if(关键字!=null)
{
folder.Keywords=关键字。选择(关键字=>
新关键字
{
文件夹=文件夹,
Type=“web”,
Value=关键字,
}).ToList();
}
//插入到存储库中
_folderRepository.InsertOrUpdate(文件夹);
//拯救
_folderRepository.UnitOfWork.Save();
}
/// 
///通过其id获取“文件夹”
/// 
/// 
/// 
公用文件夹GetFolder(Guid id)
{
return\u folderRepository.Find(id);
}
#端区
#区域文件方法
/// 
///添加新的“文件”
/// 
/// 
/// 
/// 
/// 
/// 
/// 
/// 
public void AddFile(UserReference UserReference,文件夹文件夹,FileData数据,字符串名称,字符串标题=”,IEnumerable keywords=null,bool shared=false)
{
var file=新文件
{
Name=Name,
文件夹=文件夹,
FileData=data,
CreatedBy=userReference,
Type=data.Type
};
if(关键字!=null)
{
file.Keywords=关键字。选择(关键字=>
新关键字
{
File=File,
Type=“web”,
Value=关键字,
}).ToList();
}
folder.Files.Add(文件);
folder.Updated=DateTime.UtcNow;
_folderRepository.InsertOrUpdate(文件夹);
//拯救
_folderRepository.UnitOfWork.Save();
}
/// 
///通过其id获取“文件”
/// 
/// 
/// 
公共文件GetFile(Guid id)
{
return\u fileRepository.Find(id);
}
#端区
}
总结如下: 我应该使用该服务创建文件夹对象吗。或者服务应该只使用工厂吗class File { public File(string name, Folder folder, FileData data, UserReference createdBy, IEnumerable<string> keywords = null) { //... } } ... class Folder { public File AddFile(string name, FileData data, UserReference createdBy, IEnumerable<string> keywords = null) { var file = new File(name, this, data, createdBy, keywords) this.Files.Add(file); this.Updated = DateTime.UtcNow; return file; } } ... public void AddFile(UserReference userReference, Guid folderId, FileData data, string name, string title = "", IEnumerable<string> keywords = null, bool shared = false) { var folder = _folderRepository.Find(folderId); if (folder == null) throw new Exception(); folder.AddFile(name, data, keywords); _folderRepository.InsertOrUpdate(folder); _folderRepository.UnitOfWork.Save(); }