Search code examples
aspnetboilerplate

Error "Must set UnitOfWorkManager before use it"


I'm developing the service within ASP.NET Boilerplate engine and getting the error from the subject. The nature of the error is not clear, as I inheriting from ApplicationService, as documentation suggests. The code:

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();
        }
    }
}

The error appears even before the app flow jumps to 'SaveBlobData' method. Am I missed something?


Solution

  • Hate to answer my own questions, but here it is... after a while, I found out that if UnitOfWorkManager is not available for some reason, I can instantiate it in the code, by initializing IUnitOfWorkManager in the constructor. Then, you can simply use the following construction in your Save method:

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