代码之家  ›  专栏  ›  技术社区  ›  John Bull

错误“在使用UnitOfWorkManager之前必须设置它”

  •  3
  • John Bull  · 技术社区  · 9 年前

    namespace MyAbilities.Api.Blob
    {
        public class BlobService : ApplicationService, IBlobService
        {
            public readonly IRepository<UserMedia, int> _blobRepository;
    
            public BlobService(IRepository<UserMedia, int> blobRepository)
            {
                _blobRepository = blobRepository;
            }
    
            public async Task<List<BlobDto>> UploadBlobs(HttpContent httpContent)
            {
                var blobUploadProvider = new BlobStorageUploadProvider();
    
                var list = await httpContent.ReadAsMultipartAsync(blobUploadProvider)
                    .ContinueWith(task =>
                    {
                        if (task.IsFaulted || task.IsCanceled)
                        {
                            if (task.Exception != null) throw task.Exception;
                        }
    
                        var provider = task.Result;
                        return provider.Uploads.ToList();
                    });
    
                // store blob info in the database
    
                foreach (var blobDto in list)
                {
                    SaveBlobData(blobDto);
                }
    
                return list;
            }
    
            public void SaveBlobData(BlobDto blobData)
            {
                UserMedia um = blobData.MapTo<UserMedia>();
                _blobRepository.InsertOrUpdateAndGetId(um);
                CurrentUnitOfWork.SaveChanges();
            }
    
            public async Task<BlobDto> DownloadBlob(int blobId)
            {
                // TODO: Implement this helper method. It should retrieve blob info
                // from the database, based on the blobId. The record should contain the
                // blobName, which should be returned as the result of this helper method.
                var blobName = GetBlobName(blobId);
    
                if (!String.IsNullOrEmpty(blobName))
                {
                    var container = BlobHelper.GetBlobContainer();
                    var blob = container.GetBlockBlobReference(blobName);
    
                    // Download the blob into a memory stream. Notice that we're not putting the memory
                    // stream in a using statement. This is because we need the stream to be open for the
                    // API controller in order for the file to actually be downloadable. The closing and
                    // disposing of the stream is handled by the Web API framework.
                    var ms = new MemoryStream();
                    await blob.DownloadToStreamAsync(ms);
    
                    // Strip off any folder structure so the file name is just the file name
                    var lastPos = blob.Name.LastIndexOf('/');
                    var fileName = blob.Name.Substring(lastPos + 1, blob.Name.Length - lastPos - 1);
    
                    // Build and return the download model with the blob stream and its relevant info
                    var download = new BlobDto
                    {
                        FileName = fileName,
                        FileUrl = Convert.ToString(blob.Uri),
                        FileSizeInBytes = blob.Properties.Length,
                        ContentType = blob.Properties.ContentType
                    };
    
                    return download;
                }
    
                // Otherwise
                return null;
            }
    
    
            //Retrieve blob info from the database
            private string GetBlobName(int blobId)
            {
                throw new NotImplementedException();
            }
        }
    }
    

    该错误甚至在应用程序流跳转到“SaveBlobData”方法之前就出现了。我错过什么了吗?

    1 回复  |  直到 9 年前
        1
  •  0
  •   John Bull    9 年前

    我不想回答我自己的问题,但这是。。。过了一段时间,我发现如果由于某种原因UnitOfWorkManager不可用,我可以通过在构造函数中初始化IUnitOfWorkManager在代码中实例化它。然后,您可以在保存方法中简单地使用以下构造:

        using (var unitOfWork = _unitOfWorkManager.Begin())
        {
            //Save logic...
    
            unitOfWork.Complete();
        }
    
    推荐文章