簡體   English   中英

嘗試使用 INamedBucketProvider 從 C# 應用程序連接到 Couchbase 時訪問被拒絕錯誤

[英]Access Denied error while trying to use INamedBucketProvider to connect on Couchbase from C# application

我正在嘗試使用接口INamedBucketProvider ,但出現“拒絕訪問”錯誤。 當我嘗試僅使用IBucketProvider進行連接時,它工作得很好。

以下是我的代碼的一些重要部分:

public interface ICustomerBucketProvider : INamedBucketProvider
{
    // nothing goes in here!
}
public static class IServiceCollectionExtension
{
    public static IServiceCollection AddCouchbaseConnector(this IServiceCollection services)
    {
        services.AddCouchbase(opt => 
        {
            opt.ConnectionString = "couchbase://localhost";
            opt.UserName = "Administrator";
            opt.Password = "asd123";
            opt.Buckets = new[] { "customers" };
        });

        services.AddCouchbaseBucket<ICustomerBucketProvider>("customers");

        return services;
    }
}
public class NativeInjectorBootStrapper
{
    public static void RegisterServices(IServiceCollection services)
    {
        // ...
        // ...
        // ...

        services.AddCouchbaseConnector();
    }
}

這有效:

private readonly IBucketProvider _bucketProvider;

public CustomerEventHandler(IBucketProvider bucketProvider)
{
    _bucketProvider = bucketProvider;
}

private async Task<ICouchbaseCollection> GetCouchbaseCollection()
{
    var bucket = await _bucketProvider.GetBucketAsync("customers");
    var collection = bucket.DefaultCollection();
    return collection;
}

這不起作用:

private readonly ICustomerBucketProvider _customerBucketProvider;

public CustomerEventHandler(ICustomerBucketProvider customerBucketProvider)
{
    _customerBucketProvider = customerBucketProvider;
}

private async Task<ICouchbaseCollection> GetCouchbaseCollection()
{
    var bucket = await _customerBucketProvider.GetBucketAsync();
    var collection = bucket.DefaultCollection();
    return collection;
}

難道我做錯了什么?

因此,我決定實現自己的結構來處理存儲桶和 collections:

public interface ICouchbaseBucketBase
{
    public ICouchbaseCollection DefaultCollection { get; }
}

public class CouchbaseBucketBase : ICouchbaseBucketBase
{
    public ICouchbaseCollection DefaultCollection { get; private set; }

    protected readonly IBucket _bucket;

    public CouchbaseBucketBase(IBucketProvider bucketProvider, string bucketName)
    {
        _bucket = bucketProvider.GetBucketAsync(bucketName).GetAwaiter().GetResult();

        DefaultCollection = GetCollection();
    }

    protected ICouchbaseCollection GetCollection(string collectionName = null) =>
        !string.IsNullOrWhiteSpace(collectionName) ?
        _bucket.Collection(collectionName) : _bucket.DefaultCollection();
}
public interface ICustomerBucket : ICouchbaseBucketBase { }

public class CustomerBucket : CouchbaseBucketBase, ICustomerBucket
{
    //public ICouchbaseCollection OtherNonDefaultCollection { get; private set; }

    public CustomerBucket(IBucketProvider bucketProvider) : base(bucketProvider, "customers")
    {
        //OtherNonDefaultCollection = GetCollection("OtherNonDefault");
    }
}
public static class IServiceCollectionExtension
{
    public static IServiceCollection AddCouchbaseConnector(this IServiceCollection services)
    {
        services.AddCouchbase(opt =>
        {
            opt.ConnectionString = "couchbase://localhost";
            opt.UserName = "Administrator";
            opt.Password = "asd123";
            opt.Buckets = new[] { "customers" };
        });

        services.AddTransient<ICustomerBucket, CustomerBucket>();

        return services;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM