BLOB-объект хранилища Azure без Autofac - PullRequest
0 голосов
/ 31 октября 2019

Мы разрабатываем веб-API .NET Core 3.0 для загрузки изображений в хранилище BLOB-объектов Azure. Я наткнулся на пример, чтобы добиться того же.

Ниже приведен фрагмент из Startup.cs, который использует Autofac, в частности ContainerBuilder и IComponentContext.

        private static void ConfigureStorageAccount(ContainerBuilder builder)
        {
            AzureTableStorageDebugConnectionString = Configuration["Azure:Storage:ConnectionString"];

            builder.Register(c => CreateStorageAccount(AzureTableStorageDebugConnectionString));
        }

        private static CloudStorageAccount CreateStorageAccount(string connection)
        {
            if (String.IsNullOrEmpty(connection))
            {
                throw new Exception("Azure Storage connection string is null!");
            }
            return CloudStorageAccount.Parse(connection);
        }

        private static void ConfigureServicesWithRepositories(ContainerBuilder builder)
        {
            builder.RegisterType<ImageUploadService>().AsImplementedInterfaces().InstancePerLifetimeScope();           
        }

        private static void ConfigureAzureCloudBlobContainers(ContainerBuilder builder)
        {
            builder.Register(c => c.Resolve<CloudStorageAccount>().CreateCloudBlobClient());

            builder.Register(c => GetBlobContainer(c, UploadedImagesCloudBlobContainerName))
                .Named<CloudBlobContainer>(UploadedImagesCloudBlobContainerName);
        }

        private static CloudBlobContainer GetBlobContainer(IComponentContext context, string blobContainerName)
        {
            var blob = context.Resolve<CloudBlobClient>().GetContainerReference(blobContainerName);

            var createdSuccessfully = blob.CreateIfNotExistsAsync().Result;

            if (createdSuccessfully)
            {
                blob.SetPermissionsAsync(new BlobContainerPermissions
                {
                    PublicAccess = BlobContainerPublicAccessType.Blob
                });
            }

            return blob;
        }

        private static void ConfigureCloudBlobContainersForServices(ContainerBuilder builder)
        {
            builder.RegisterType<ImageUploadService>()
                   .WithParameter(
                       (pi, c) => pi.ParameterType == (typeof(CloudBlobContainer)),
                       (pi, c) => c.ResolveNamed<CloudBlobContainer>(UploadedImagesCloudBlobContainerName))
                       .AsImplementedInterfaces();
        }


Можно ли избавитьсяAutofac полностью и использовать Core 3.0 для достижения той же функциональности в Startup.cs?

1 Ответ

1 голос
/ 01 ноября 2019

Насколько я знаю, Autofac используется для DI. Если вы не хотите использовать его, вы можете напрямую загрузить содержимое в свою учетную запись хранения следующим образом:

string connString = "the connection string from portal for your storage account, DefaultEndpointsProtocol=https;AccountName=storagetest789;AccountKey=G36m***==;EndpointSuffix=core.windows.net";
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connString);
CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer cloudBlobContainer =cloudBlobClient.GetContainerReference("container_name");
cloudBlobContainer.CreateIfNotExists();
CloudBlockBlob cloudBlockBlob = cloudBlobContainer.GetBlockBlobReference("blob_name");
cloudBlockBlob.UploadFromFile("file_path");

Предложение:

Чтобы избежать повторного создания CloudBlobClient, вы можете создатьфабричный класс, который может производить CloudBlobContainer или CloudBlockBlob напрямую.

И вы можете использовать Официальную реализацию Microsoft DI . И зарегистрируйте свою фабрику в Starup.

//For example, the interface is IStorageFactory, and your implementation is MyStroageFactory
services.AddSingleton<IStorageFactory, MyStroageFactory>();

И тогда вы можете ввести фабрику. Например, в контроллере:

public class HomeController : Controller
{

    private IStorageFactory _myStorageFactory;

    public HomeController(IStorageFactory myStorageFactory)
    {
        _myStorageFactory = myStorageFactory;
    }

    public IActionResult Index()
    {
        //For example, I defined a getCloudBlockBlob method in factory
        CloudBlockBlob cloudBlockBlob = _myStorageFactory.getCloudBlockBlob("container_name","blob_name");
        cloudBlockBlob.UploadFromFile(....);

        return Ok("Uploaded!");
    }

}
...