代码之家  ›  专栏  ›  技术社区  ›  Jason Shave

无法访问方法(具有ASP.NET核心的Azure表)

  •  1
  • Jason Shave  · 技术社区  · 6 年前

    我正在尝试从另一个类(我视图的控制器)访问一个方法,在这个类中我连接到Azure表并更新一个实体。

    // this requires an object reference
    HttpResponseMessage httpResponseMessage = AzureTableConn.UpdateTenantSettings(post);
    

    public class AzureTableConn
    {
        public AzureTableConn(IConfiguration configuration)
        {
            Configuration = configuration;
        }
    
        private IConfiguration Configuration { get; set; }
    
        private CloudTable TableConnection(string tableName)
        {
            var connectionString = Configuration["AzureTableStorageConnectionString"];
            var cloudStorageAccount = CloudStorageAccount.Parse(connectionString);
            CloudTableClient tableClient = cloudStorageAccount.CreateCloudTableClient();
            CloudTable cloudTable = tableClient.GetTableReference(tableName);
            return cloudTable;            
        }
    
        public HttpResponseMessage UpdateTenantSettings(TenantSettingsModel tenantSettingsModel)
        {
            CloudTable cloudTable = TableConnection("TenantSettings");
            Task<TableResult> mergeEntity = cloudTable.ExecuteAsync(TableOperation.Merge(tenantSettingsModel));
            return new HttpResponseMessage();
        }
    }
    

    我想打电话给 UpdateTenantSettings IConfiguration 对象到默认构造函数。我觉得自己被困在第22条军规中,不知道该怎么办。

    我的意图是利用我的 AzureTableConn 在我的应用程序中初始化,而不是每次我想读/写Azure表时都创建它的新实例。我试着把我的 AzureTableConn公司 I配置 . 我也尝试过将构造函数设置为static,但这再次打破了它,并告诉我“静态构造函数必须是无参数的”。

    我也试着在我的报告中添加以下内容 Startup.cs 文件:

    services.Configure<AzureTableConnectionString>(Configuration);
    

    在哪里? AzureTableConnectionString

    public class AzureTableConnectionString
    {
        public string ConnectionString { get; set; }
    }
    

    但是,我不知道这是否正确,也不知道如何实施。

    那么,我如何在一个类中提取我的Azure密钥保险库配置设置,然后在同一个类中使用方法重新使用到Azure表的连接,并从另一个类中访问这些方法,在这个类中,我需要提供参数,例如要创建/更新/删除的实体(数据)等。?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Kirk Larkin    6 年前

    您可以通过注册让ASP.NET核心为您处理此问题 AzureTableConn ConfigureServices ):

    services.AddSingleton<AzureTableConn>();
    

    public class SomeController : Controller
    {
        private readonly AzureTableConn _azureTableConn;
    
        public SomeController(AzureTableConn azureTableConn)
        {
            _azureTableConn = azureTableConn;
        }
    
        public IActionResult SomeAction()
        {
            ...
            var httpResponseMessage = _azureTableConn.UpdateTenantSettings(post);
            ...
        }
    }
    

    在这个例子中,您可以使用 _azureTableConn 控制者的任何动作。因为我们用过 AddSingleton

    医生们很好地解释了这一点: Dependency injection in ASP.NET Core .

        2
  •  2
  •   Nkosi    6 年前

    public interface IAzureTableConnection {
        Task<HttpResponseMessage> UpdateTenantSettings(TenantSettingsModel tenantSettingsModel);
    }
    

    IConfiguration . 相反,在composition根目录中获取所需的内容并将其传递给依赖类。

    Startup

    private IConfiguration Configuration { get; set; }
    
    public void ConfigureServices(IServiceCollection services) {
    
        //...
    
        var connectionString = Configuration["AzureTableStorageConnectionString"];
        var cloudStorageAccount = CloudStorageAccount.Parse(connectionString);
        CloudTableClient tableClient = cloudStorageAccount.CreateCloudTableClient();
    
        services.AddScoped<IAzureTableConnection>(_ => new AzureTableConnection(tableClient));
    
        //...
    }
    

    依赖类只需要依赖于配置的 CloudTableClient

    public class AzureTableConnection: IAzureTableConnection {
        private readonly CloudTableClient tableClient;
    
        public AzureTableConnection(CloudTableClient tableClient) {
            this.tableClient = tableClient;
        }
    
        private CloudTable TableConnection(string tableName) {
            CloudTable cloudTable = tableClient.GetTableReference(tableName);
            return cloudTable;            
        }
    
        public async Task<HttpResponseMessage> UpdateTenantSettings(TenantSettingsModel tenantSettingsModel) {
            CloudTable cloudTable = TableConnection("TenantSettings");
            var mergeEntity = await cloudTable.ExecuteAsync(TableOperation.Merge(tenantSettingsModel));
    
            //...do something with the result
    
            return new HttpResponseMessage();
        }
    }
    

    您的控制器将取决于 IAzureTableConnection

    public class MyController : Controller {
        private readonly IAzureTableConnection tableConnection;
    
        public MyController(IAzureTableConnection tableConnection) {
            this.tableConnection = tableConnection;
        }
    
        public async Task<IActionResult> MyAction() {
    
    
            //...
    
            HttpResponseMessage httpResponseMessage = await tableConnection.UpdateTenantSettings(post);
    
            //...
        }
    }