3

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?

John Bull
  • 933
  • 1
  • 12
  • 20

1 Answers1

0

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();
    }
John Bull
  • 933
  • 1
  • 12
  • 20
  • 1
    You probably using app service from controller via class reference. You could make the UploadBlobs method virtual in that case. Then UOW intercepter can handle it. – hikalkan Aug 24 '17 at 05:44
  • 1
    There's a bad practise in the code. Do the upload in controller and don't use HttpContext in application service. Application services need to be seperated from web references. – Alper Ebicoglu Aug 24 '17 at 05:49