Dependency injection Cosmos DB的依赖项注入不会创建documentClient对象

Dependency injection Cosmos DB的依赖项注入不会创建documentClient对象,dependency-injection,azure-functions,azure-cosmosdb,Dependency Injection,Azure Functions,Azure Cosmosdb,我在azure函数中有一个服务 public MyService( IConfigurationProvider configurationProvider, ISerializationHelperService serializationHelperService, ICommandListBuilder commandListBuilder, [CosmosDB(

我在azure函数中有一个服务

    public MyService(
            IConfigurationProvider configurationProvider,
            ISerializationHelperService serializationHelperService,
            ICommandListBuilder commandListBuilder,
            [CosmosDB(
                StaticSettings.Db,
                StaticSettings.MyCollection.Collection,
                ConnectionStringSetting = StaticSettings.DbConnectionStringSetting)] IDocumentClient documentClient)
        {
            //my logic here - this does get hit
        }
我的服务已实例化,但documentClient为空

我怎样才能正确地设置它?我没有任何错误

我已检查,连接设置没有问题

    public const string Db = "mydbname";
    public const string DbConnectionStringSetting = "CosmosDBConnection";

    public static class MyCollection
    {
        public const string Collection = "mycollectionname";
        public static Uri CollectionUri => UriFactory.CreateDocumentCollectionUri(Db, Collection);
    }
我正在使用带有AddServices方法的Startup类来设置DI

我需要在里面放点什么吗


Paul

我有一个Azure function v2项目,我能够注入所有依赖项。为
IDocumentClient

string databaseEndPoint = Environment.GetEnvironmentVariable("DatabaseEndPoint");
        string databaseKey = Environment.GetEnvironmentVariable("DatabaseKey");
        builder.Services.AddSingleton<IDocumentClient>(new DocumentClient(new System.Uri(databaseEndPoint), databaseKey,
            new ConnectionPolicy
            {
                ConnectionMode = ConnectionMode.Direct,
                ConnectionProtocol = Protocol.Tcp,
                RequestTimeout = TimeSpan.FromMinutes(5),//Groupasset sync has some timeout issue with large payload
                // Customize retry options for Throttled requests
                RetryOptions = new RetryOptions()
                {
                    MaxRetryAttemptsOnThrottledRequests = 5,
                    MaxRetryWaitTimeInSeconds = 60
                }
            }
        ));

希望这会有帮助

您的
启动计划是什么样子的?特别是,您确定服务集合中有可用的
IDocumentClient
实例吗?您可以在
启动结束时中断。配置
并遍历
IFunctionsHostBuilder.Services
。如果找不到
ServiceDescriptor
,其中
ServiceDescriptor.ServiceType.Name
IDocumentClient
DocumentClient
,则您知道它未注册,您必须自己添加它。我不能说我以前在构造函数注入中使用过Azure特定的属性,所以我不知道你是否期望发生一些神奇的事情,我不知道我不确定在启动文件中放什么我回到笔记本电脑时会看一看。目前没有什么特别的,因为我从中复制的另一个函数没有任何内容。同样,这是使用diconfig而不是startup类如何注册其他服务,
MyService
IConfigurationProvider
,等等?我可能错了,但我很确定没有
IDocumentClient
注册为默认启动的一部分。您可能需要实现自己的抽象,该抽象将初始化DocumentClient,然后通过在服务集合中注册的接口公开所需的功能,然后将该接口注入
MyService
。我在这里找到了这个答案,这几乎解释了同样的问题:
protected readonly IDocumentClient client;

    protected BaseDao(IDocumentClient client)
    {
        this.client = client;
    }