Domain driven design DDD中的工厂、服务、存储库
我对DDD中的工厂、存储库和服务有一些问题。我有以下实体:文件夹、文件、文件数据 我认为“文件夹”是一个聚合根目录,应该负责创建文件和FileData对象 所以我的第一个问题是,我应该使用工厂来创建这个aggreate,还是由存储库来创建?现在我有两个存储库,一个用于文件夹,另一个用于文件,但在我看来,我应该将它们合并在一起。下面的代码片段显示了我的文件夹存储库,它位于我的基础结构层中: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 {
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();
}