Exemplo n.º 1
0
        /// <summary>
        /// 向数据源中添加帖子。
        /// </summary>
        /// <param name="dataFacade">数据源的外观。</param>
        /// <param name="indexEntity">帖子索引实体对象。</param>
        /// <param name="contentEntity">帖子内容对象。</param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException">
        ///     <paramref name="dataFacade"/>为null
        ///     或
        ///     <paramref name="indexEntity"/>为null
        ///     或
        ///     <paramref name="contentEntity"/>为null
        /// </exception>
        /// <exception cref="DataFacadeException">数据源抛出了未经处理的异常</exception>
        public static async Task <int> AddPost(this IDataFacade dataFacade,
                                               PostEntity indexEntity, PostContentEntity contentEntity)
        {
            if (dataFacade == null)
            {
                throw new ArgumentNullException(nameof(dataFacade));
            }
            if (indexEntity == null)
            {
                throw new ArgumentNullException(nameof(indexEntity));
            }
            if (contentEntity == null)
            {
                throw new ArgumentNullException(nameof(contentEntity));
            }

            // 将内容实体对象插入到数据源中。
            await dataFacade.AddPostContentEntity(contentEntity);

            // 将帖子索引实体对象插入到数据源中。
            dataFacade.AddPostIndexEntity(indexEntity);
            await dataFacade.CommitChanges();

            return(indexEntity.Id);
        }
Exemplo n.º 2
0
 public LessonService(IDataFacade facade, IFileHandler videoStream)
 {
     _lessonConv  = new LessonConverter();
     _secConv     = new SectionConverter();
     _facade      = facade;
     _videoStream = videoStream;
 }
Exemplo n.º 3
0
 public SectionService(IDataFacade facade)
 {
     _sectionConv = new SectionConverter();
     _crsConv     = new CourseConverter();
     _lesConv     = new LessonConverter();
     _facade      = facade;
 }
        public void Init()
        {
            Mock<IDataFacade> mock = new Mock<IDataFacade>();
            _facade = new Mock<IDataFacade>().Object;
            

        }
Exemplo n.º 5
0
        /// <summary>
        /// 打开包含给定帖子的给定索引处的图片的数据流。
        /// </summary>
        /// <param name="dataFacade"></param>
        /// <param name="postId">帖子 ID</param>
        /// <param name="imageIndex">图像索引</param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="dataFacade"/>为null
        /// </exception>
        /// <exception cref="ArgumentOutOfRangeException">
        /// <paramref name="imageIndex"/>小于0 或 大于等于9
        /// </exception>
        public static async Task <Stream> OpenPostImage(this IDataFacade dataFacade, int postId, int imageIndex)
        {
            if (dataFacade == null)
            {
                throw new ArgumentNullException(nameof(dataFacade));
            }
            if (imageIndex < 0 || imageIndex >= 9)
            {
                throw new ArgumentOutOfRangeException(nameof(imageIndex));
            }

            var(indexEntity, contentEntity) = await FindPost(dataFacade, postId);

            if (imageIndex >= contentEntity.ImageIds.Length)
            {
                return(null);
            }

            var imageId = contentEntity.ImageIds[imageIndex];

            if (imageId == null)
            {
                return(null);
            }

            return(await dataFacade.OpenImage(imageId.Value));
        }
Exemplo n.º 6
0
 public CourseService(IDataFacade facade)
 {
     _crsConv      = new CourseConverter();
     _userConv     = new UserConverter();
     _secConverter = new SectionConverter();
     _catConv      = new CategoryConverter();
     _lesConv      = new LessonConverter();
     _facade       = facade;
 }
Exemplo n.º 7
0
        /// <summary>
        /// 获取给定帖子所属的板块 ID。
        /// </summary>
        /// <param name="dataFacade"></param>
        /// <param name="commentId">帖子 ID</param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="dataFacade"/>为null
        /// </exception>
        /// <exception cref="CommentNotFoundException">给定的评论未找到时抛出</exception>
        /// <exception cref="PostNotFoundException">给定的评论所属的帖子未找到时抛出</exception>
        public static async Task <PostEntity> GetPostForComment(this IDataFacade dataFacade, int commentId)
        {
            if (dataFacade == null)
            {
                throw new ArgumentNullException(nameof(dataFacade));
            }

            var indexEntity = await dataFacade.Comments
                              .FirstOrDefaultAsync(e => e.Id == commentId && e.IsRemoved == false);

            if (indexEntity == null)
            {
                throw new CommentNotFoundException();
            }

            int postId;

            if (indexEntity.PostId != null)
            {
                // 当前评论是一级评论
                postId = indexEntity.PostId.Value;
            }
            else
            {
                // 当前评论是二级评论
                if (indexEntity.CommentId == null)
                {
                    throw new CommentNotFoundException();
                }

                var parentEntity = await dataFacade.Comments
                                   .FirstOrDefaultAsync(e => e.Id == indexEntity.CommentId.Value);

                if (parentEntity == null)
                {
                    throw new CommentNotFoundException();
                }

                if (parentEntity.PostId == null)
                {
                    throw new CommentNotFoundException();
                }

                postId = parentEntity.PostId.Value;
            }

            var postEntity = await dataFacade.Posts
                             .FirstOrDefaultAsync(e => e.Id == postId);

            if (postEntity == null)
            {
                throw new PostNotFoundException();
            }

            return(postEntity);
        }
Exemplo n.º 8
0
 public AuthController(IWechatApiService wechatApiService,
                       IJwtService jwtService,
                       IDataFacade dataFacade,
                       ILogger <AuthController> logger)
 {
     _wechatApi  = wechatApiService;
     _jwt        = jwtService;
     _dataFacade = dataFacade;
     _logger     = logger;
 }
Exemplo n.º 9
0
        /// <summary>
        /// 实际的过程可能非常复杂,Assembler需要通过各种本地或远程方法
        /// 获得一个 DTO 对象接口的引用,而且考虑到效率因素,DTO 本身应该相对
        /// 客户程序而言,到实际外观对象更近,否则DTO的“打包”反而成为累赘。
        /// </summary>
        /// <returns></returns>
        public IXmlDataDto CreateDto(IDataFacade facade)
        {
            if (facade == null)
            {
                throw new ArgumentNullException("facade");
            }
            IXmlDataDto dto = new XmlDataDto();

            dto.Facade = facade;
            return(dto);
        }
        private void ClientForm_Load(object sender, System.EventArgs e)
        {
            string configFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;

            txtConfigFile.Text = configFile;
            RemotingConfiguration.Configure(configFile, false);
            string typeName = "Test.Rem.Common.IDataFacade";

            remObj          = (IDataFacade)RemHelper.CreateWellKnownType(typeName);
            txtMessage.Text = "Hello world";
        }
Exemplo n.º 11
0
        /// <summary>
        /// 移除帖子图片。
        /// </summary>
        /// <param name="dataFacade"></param>
        /// <param name="postId">帖子 ID。</param>
        /// <param name="indexesToRemove">要移除的图片索引。</param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException">
        ///     <paramref name="dataFacade"/>为null
        ///     或
        ///     <paramref name="indexesToRemove"/>为null
        /// </exception>
        /// <exception cref="PostNotFoundException">指定的帖子不存在。</exception>
        public static async Task RemovePostImages(this IDataFacade dataFacade,
                                                  int postId, IEnumerable <int> indexesToRemove)
        {
            if (dataFacade == null)
            {
                throw new ArgumentNullException(nameof(dataFacade));
            }
            if (indexesToRemove == null)
            {
                throw new ArgumentNullException(nameof(indexesToRemove));
            }

            // TODO: 在这里添加代码对 indexesToRemove 进行验证

            var indexEntity = await dataFacade.Posts
                              .Where(e => e.Id == postId)
                              .FirstOrDefaultAsync();

            if (indexEntity == null)
            {
                throw new PostNotFoundException();
            }

            var contentId     = new ObjectId(indexEntity.ContentId);
            var contentEntity = await dataFacade.FindPostContentEntity(contentId);

            var indexesToRemoveConcrete = indexesToRemove.ToArray();

            // 删除图片数据
            var removeTasks = new List <Task>();

            foreach (var imageIndex in indexesToRemoveConcrete.Where(i => i >= 0 && i < contentEntity.ImageIds.Length))
            {
                var imageId = contentEntity.ImageIds[imageIndex];
                if (imageId == null)
                {
                    continue;
                }

                removeTasks.Add(dataFacade.RemoveImage(imageId.Value));
            }

            await Task.WhenAll(removeTasks);

            // 更新内容实体对象
            var imageSetDict = indexesToRemoveConcrete.ToDictionary <int, int, ObjectId?>(i => i, i => null);
            await dataFacade.UpdatePostContentImageIds(contentId, imageSetDict);

            // 更新索引实体对象中的最后更新时间戳
            indexEntity.UpdateTime = DateTime.Now;
            await dataFacade.CommitChanges();
        }
Exemplo n.º 12
0
        /// <summary>
        /// 当给定的用户不存在时,向数据源添加用户。返回用户实体对象。
        /// </summary>
        /// <param name="dataFacade">数据源外观。</param>
        /// <param name="wechatId">用户的微信 ID。</param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException">
        ///     <paramref name="dataFacade"/> 为 null
        ///     或
        ///     <paramref name="wechatId"/> 为 null
        /// </exception>
        public static async Task <UserEntity> AddOrFindUserByWechatId(this IDataFacade dataFacade, string wechatId)
        {
            if (dataFacade == null)
            {
                throw new ArgumentNullException(nameof(dataFacade));
            }
            if (wechatId == null)
            {
                throw new ArgumentNullException(nameof(wechatId));
            }

            var existingEntity = await dataFacade.Users
                                 .Where(u => u.WechatId == wechatId)
                                 .FirstOrDefaultAsync();

            if (existingEntity != null)
            {
                // 用户已经存在于数据源中
                return(existingEntity);
            }

            // 用户在数据源中未找到
            var userEntity = new UserEntity
            {
                WechatId = wechatId
            };

            try
            {
                dataFacade.AddUser(userEntity);
                await dataFacade.CommitChanges();

                return(userEntity);
            }
            catch (DataFacadeException)
            {
                // 重做用户查询
                existingEntity = await dataFacade.Users
                                 .Where(u => u.WechatId == wechatId)
                                 .FirstOrDefaultAsync();

                if (existingEntity != null)
                {
                    return(existingEntity);
                }

                // 重做用户查询仍然无法找到用户
                throw;
            }
        }
Exemplo n.º 13
0
        FindPosts(this IDataFacade dataFacade, int?region, int?userId, int page, int itemsPerPage)
        {
            if (dataFacade == null)
            {
                throw new ArgumentNullException(nameof(dataFacade));
            }
            if (page < 0)
            {
                throw new ArgumentOutOfRangeException(nameof(page));
            }
            if (itemsPerPage <= 0)
            {
                throw new ArgumentOutOfRangeException(nameof(itemsPerPage));
            }

            // 构造查询
            var query = dataFacade.Posts
                        .AsNoTracking()
                        .Where(e => e.IsRemoved == false);

            if (region != null)
            {
                query = query.Where(e => e.PostRegionId == region.Value);
            }

            if (userId != null)
            {
                query = query.Where(e => e.AuthorId == userId.Value);
            }

            var indexEntities = await query.OrderByDescending(e => e.UpdateTime)
                                .Paginate(page, itemsPerPage)
                                .ToListAsync();

            var contentEntities =
                await dataFacade.FindPostContentEntities(indexEntities.Select(e => new ObjectId(e.ContentId)));

            var contentDict = contentEntities.ToDictionary(e => e.Id);

            return(indexEntities.Select(indexEntity =>
            {
                if (contentDict.TryGetValue(new ObjectId(indexEntity.ContentId), out var contentEntity))
                {
                    return (indexEntity, contentEntity);
                }
                return (indexEntity, null);
            }).ToList());
        }
Exemplo n.º 14
0
        /// <summary>
        /// 向数据源添加评论索引实体对象及其对应的内容实体对象。
        /// </summary>
        /// <param name="dataFacade"></param>
        /// <param name="indexEntity">要添加的索引实体对象。</param>
        /// <param name="contentEntity">要添加的内容实体对象。</param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException">
        ///     <paramref name="indexEntity"/>为null
        ///     或
        ///     <paramref name="contentEntity"/>为null
        /// </exception>
        public static async Task AddPostComment(this IDataFacade dataFacade,
                                                CommentEntity indexEntity, CommentContentEntity contentEntity)
        {
            if (indexEntity == null)
            {
                throw new ArgumentNullException(nameof(indexEntity));
            }
            if (contentEntity == null)
            {
                throw new ArgumentNullException(nameof(contentEntity));
            }

            dataFacade.AddCommentIndexEntity(indexEntity);
            await dataFacade.CommitChanges();

            await dataFacade.AddCommentContentEntity(contentEntity);
        }
Exemplo n.º 15
0
        FindUserComments(this IDataFacade dataFacade, int userId)
        {
            if (dataFacade == null)
            {
                throw new ArgumentNullException(nameof(dataFacade));
            }

            var indexEntities = await dataFacade.Comments
                                .Where(e => e.AuthorId == userId && e.IsRemoved == false)
                                .ToListAsync();

            var contentEntities = await dataFacade.FindCommentContentEntities(
                indexEntities.Select(e => new ObjectId(e.ContentId)));

            return(indexEntities.Zip(contentEntities, (ie, ce) => (ie, ce))
                   .ToList());
        }
Exemplo n.º 16
0
        FindPostComments(this IDataFacade dataFacade, int postId)
        {
            if (dataFacade == null)
            {
                throw new ArgumentNullException(nameof(dataFacade));
            }

            // 获取所有一级评论
            var indexEntitiesLv1 = await dataFacade.Comments
                                   .Where(e => e.PostId == postId && e.IsRemoved == false)
                                   .ToListAsync();

            var contentEntitiesLv1 = await dataFacade.FindCommentContentEntities(
                indexEntitiesLv1.Select(e => new ObjectId(e.ContentId)));

            var indexEntitiesLv2   = new List <CommentEntity>();
            var contentEntitiesLv2 = new List <CommentContentEntity>();

            foreach (var entityLv1 in indexEntitiesLv1)
            {
                // 获取当前枚举到的一级评论下的所有二级评论
                var indexEntitiesLv2Current = await dataFacade.Comments
                                              .Where(e => e.CommentId == entityLv1.Id &&
                                                     e.IsRemoved == false)
                                              .ToListAsync();

                var contentEntitiesLv2Current = await dataFacade.FindCommentContentEntities(
                    indexEntitiesLv2Current.Select(e => new ObjectId(e.ContentId)));

                indexEntitiesLv2.AddRange(indexEntitiesLv2Current);
                contentEntitiesLv2.AddRange(contentEntitiesLv2Current);
            }

            // 将一级评论与二级评论进行扁平化处理
            var indexEntities = indexEntitiesLv1;

            indexEntities.AddRange(indexEntitiesLv2);

            var contentEntities = contentEntitiesLv1;

            contentEntitiesLv1.AddRange(contentEntitiesLv2);

            return(indexEntities.Zip(contentEntities, (ie, ce) => (ie, ce))
                   .ToList());
        }
Exemplo n.º 17
0
        /// <summary>
        /// 查询给定的用户是否对给定的帖子进行了点赞。
        /// </summary>
        /// <param name="dataFacade"></param>
        /// <param name="userId">用户 ID。</param>
        /// <param name="postIds">帖子 ID。</param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="dataFacade"/>为null
        /// </exception>
        public static async Task <List <bool> > IsUserVotedFor(this IDataFacade dataFacade,
                                                               int userId, IEnumerable <int> postIds)
        {
            if (dataFacade == null)
            {
                throw new ArgumentNullException(nameof(dataFacade));
            }

            var userPosts = await dataFacade.UserVotePosts
                            .Where(e => e.UserId == userId)
                            .ToListAsync();

            var userPostedPosts = userPosts.Select(x => x.PostId)
                                  .ToHashSet();

            return(postIds.Select(x => userPostedPosts.Contains(x))
                   .ToList());
        }
Exemplo n.º 18
0
        /// <summary>
        /// 获取指定帖子的创建者 ID。
        /// </summary>
        /// <param name="dataFacade"></param>
        /// <param name="postId">帖子 ID。</param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="dataFacade"/>为null
        /// </exception>
        /// <exception cref="PostNotFoundException">指定的帖子不存在</exception>
        public static async Task <int> GetPostAuthorId(this IDataFacade dataFacade, int postId)
        {
            if (dataFacade == null)
            {
                throw new ArgumentNullException(nameof(dataFacade));
            }

            var indexEntity = await dataFacade.Posts
                              .AsNoTracking()
                              .Where(e => e.Id == postId && e.IsRemoved == false)
                              .FirstOrDefaultAsync();

            if (indexEntity == null)
            {
                throw new PostNotFoundException();
            }

            return(indexEntity.AuthorId);
        }
Exemplo n.º 19
0
        FindPost(this IDataFacade dataFacade, int postId)
        {
            if (dataFacade == null)
            {
                throw new ArgumentNullException(nameof(dataFacade));
            }

            var indexEntity = await dataFacade.Posts
                              // 下面的语句中务必使用 e.IsRemoved == false 以正确引导 EFCore 解析查询
                              .FirstOrDefaultAsync(e => e.Id == postId && e.IsRemoved == false);

            if (indexEntity == null)
            {
                // 没有在数据源中找到指定的帖子 ID
                throw new PostNotFoundException();
            }

            var contentId     = new ObjectId(indexEntity.ContentId);
            var contentEntity = await dataFacade.FindPostContentEntity(contentId);

            return(indexEntity, contentEntity);
        }
Exemplo n.º 20
0
        /// <summary>
        /// 删除指定的帖子。
        /// </summary>
        /// <param name="dataFacade"></param>
        /// <param name="postId">要删除的帖子 ID。</param>
        /// <param name="permanent">是否永久性地删除帖子数据</param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="dataFacade"/>为null
        /// </exception>
        /// <exception cref="DataFacadeException">当数据源抛出了未经处理的异常时抛出</exception>
        public static async Task RemovePost(this IDataFacade dataFacade, int postId, bool permanent = false)
        {
            if (dataFacade == null)
            {
                throw new ArgumentNullException(nameof(dataFacade));
            }
            if (permanent)
            {
                throw new NotImplementedException();
            }

            var indexEntity = await dataFacade.Posts
                              .Where(e => e.Id == postId && e.IsRemoved == false)
                              .FirstOrDefaultAsync();

            if (indexEntity == null)
            {
                throw new PostNotFoundException();
            }

            indexEntity.IsRemoved = true;
            await dataFacade.CommitChanges();
        }
Exemplo n.º 21
0
 public PostController(IDataFacade dataFacade, IEntityFactory entityFactory, ILogger <PostController> logger)
 {
     _dataFacade    = dataFacade ?? throw new ArgumentNullException(nameof(dataFacade));
     _entityFactory = entityFactory ?? throw new ArgumentNullException(nameof(entityFactory));
     _logger        = logger ?? throw new ArgumentNullException(nameof(logger));
 }
 public PersistentDataRetrievalStrategy(IDataFacade dataFacade, ChangeSetId lastedChangeSetId)
 {
     this.dataFacade = dataFacade;
     this.lastedChangeSetId = lastedChangeSetId;
 }
Exemplo n.º 23
0
 public ApplicationService(IDataFacade facade)
 {
     _facade          = facade;
     _applicationConv = new ApplicationConverter();
     _userConv        = new UserConverter();
 }
Exemplo n.º 24
0
 public HomeController(IDataFacade dataFacade)
 {
     _dataFacade = dataFacade;
 }
Exemplo n.º 25
0
 public BaseService()
 {
     _dataSource = new DataFacade(new DAL.ApplicationDbContext());
 }
Exemplo n.º 26
0
 public BaseService(IDataFacade dataSource)
 {
     _dataSource = dataSource;
 }
Exemplo n.º 27
0
 public HomeController(IDataFacade dataFacade)
 {
     _dataFacade = dataFacade;
 }
Exemplo n.º 28
0
 public RegionsController(IDataFacade dataFacade,
                          ILogger <RegionsController> logger)
 {
     _dataFacade = dataFacade ?? throw new ArgumentNullException(nameof(dataFacade));
     _logger     = logger ?? throw new ArgumentNullException(nameof(logger));
 }
Exemplo n.º 29
0
 public BaseHandler(IDataFacade dataSource)
 {
     _dataSource = dataSource;
 }
 public ObjectFacade(IDataFacade dataFacade, ObjectTypeDescriptorRepository objectTypeDescriptorRepository, ICommandExecutor commandExecutor)
 {
     this.dataFacade = dataFacade;
     this.commandExecutor = commandExecutor;
     this.objectTypeDescriptorRepository = objectTypeDescriptorRepository;
 }
 public MainController(IDataFacade dataFacade)
 {
     this.dataFacade = dataFacade;
 }
Exemplo n.º 32
0
 public BaseHandler()
 {
     _dataSource = new DataFacade(new Data.Entities.ApplicationDbContext());
 }
Exemplo n.º 33
0
 public FileHandlingService(IDataFacade facade, IFileHandler fileHandler)
 {
     _facade      = facade;
     _fileHanlder = fileHandler;
     _lesConv     = new LessonConverter();
 }
Exemplo n.º 34
0
        /// <summary>
        /// 向给定的帖子上传图片。
        /// </summary>
        /// <param name="dataFacade"></param>
        /// <param name="postId">帖子 ID。</param>
        /// <param name="images">图片 ID 及对应图片的数据流工厂。</param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException">
        ///     <paramref name="images"/>为null
        /// </exception>
        /// <exception cref="PostNotFoundException">
        ///     指定的帖子不存在
        ///     或
        ///     帖子存在但其删除标记为true
        /// </exception>
        public static async Task UpdatePostImages(this IDataFacade dataFacade,
                                                  int postId, IReadOnlyDictionary <int, Func <Stream> > images)
        {
            if (images == null)
            {
                throw new ArgumentNullException(nameof(images));
            }

            // TODO: 在这里添加代码对 images 执行验证

            var indexEntity = await dataFacade.Posts
                              // 下面的语句中务必使用 e.IsRemoved == true 以正确引导 EF Core 建立查询
                              .Where(e => e.Id == postId && e.IsRemoved == false)
                              .FirstOrDefaultAsync();

            if (indexEntity == null)
            {
                // 指定的帖子不存在
                throw new PostNotFoundException();
            }

            var contentId     = new ObjectId(indexEntity.ContentId);
            var contentEntity = await dataFacade.FindPostContentEntity(contentId);

            // 删除已有的、被覆盖的图片数据
            var removeTasks = new List <Task>();

            foreach (var imageIndex in images.Keys.Where(i => i >= 0 && i < contentEntity.ImageIds.Length))
            {
                var imageId = contentEntity.ImageIds[imageIndex];
                if (imageId == null)
                {
                    continue;
                }

                removeTasks.Add(dataFacade.RemoveImage(imageId.Value));
            }

            await Task.WhenAll(removeTasks);

            // 将图片上传至数据源
            var imageIds    = new ConcurrentDictionary <int, ObjectId?>();
            var uploadTasks = new List <Task>();

            foreach (var(index, imageDataStreamFactory) in images)
            {
                var imageDataStream = imageDataStreamFactory();
                uploadTasks.Add(dataFacade.UploadImage(imageDataStream)
                                .ContinueWith((t, i) =>
                {
                    imageDataStream.Close();
                    imageIds.TryAdd((int)i, t.Result);
                }, index));
            }

            await Task.WhenAll(uploadTasks);

            // 更新内容实体对象
            await dataFacade.UpdatePostContentImageIds(contentId, imageIds);

            // 更新索引实体对象中的上次更新时间戳
            indexEntity.UpdateTime = DateTime.Now;
            await dataFacade.CommitChanges();
        }
Exemplo n.º 35
0
 public AuthService(IDataFacade facade, ITokenGenerator tokenGenerator)
 {
     _userConv       = new UserConverter();
     _tokenGenerator = tokenGenerator;
     _facade         = facade;
 }
 public PendingChangesDataRetrievalStrategy(IDataFacade dataFacade, UncommittedChangeSet pendingChanges)
 {
     this.dataFacade = dataFacade;
     this.pendingChanges = pendingChanges;
 }