c# - 使用 Ninject 加载多个绑定(bind)

标签 c# .net ninject

我正在尝试在项目的类中加载绑定(bind)。我正在为缓存使用第 3 方扩展,我需要使用 c# 和 .net framework 472 加载的类如下所示。

public class CouchbaseCache : ICouchbaseCache, IDistributedCache
{
    public CouchbaseCache(ICouchbaseCacheBucketProvider provider, IOptions<CouchbaseCacheOptions> options);

    public IBucket Bucket { get; }
    public CouchbaseCacheOptions Options { get; }
}

通常,如果我必须加载,我会使用类似 Bind().To().InSingletonScope();

但是我如何通过在加载时将存储桶信息和选项作为值来为上述类做到这一点?我无法理解它。

此外,ICouchbaseCachebucketProvider 是从 INamedbucketProvider 派生的接口(interface),派生类看起来像

public interface INamedBucketProvider
{
    string BucketName { get; }

    IBucket GetBucket();
}

到目前为止,我能够像这样设置 CouchbaseClientDefinition

Bind<ICouchbaseClientDefinition>().ToMethod(ctx =>
{
      var options = new CouchbaseClientDefinition
      {
           Servers = new List<Uri>
           {
                new Uri("http://couchbase.com/")
            }
       };
       return options;
 }).InSingletonScope();

我需要为 couchbase 提供 Uri 以及存储桶名称,逻辑无处不在。任何知识共享将不胜感激。

最佳答案

如果 CouchbaseCache 的构造函数的参数在整个应用程序生命周期内都是相同的,那么您可以使用使用构造函数参数绑定(bind)来绑定(bind)它在您加载的地方就像这样:

    var options = new CouchbaseClientDefinition
      {
           Servers = new List<Uri>
           {
                new Uri("http://couchbase.com/")
            }
       };
    var couchbaseCacheBucketProvider= new CouchbaseCacheBucketProvider
    {
        ...
    };



 Bind<ICouchbaseClientDefinition().To<CouchbaseCache >()
            .WithConstructorArgument(couchbaseCacheBucketProvider, options);

但您必须提供 couchbaseCacheBucketProvider。

如果参数不同但它们是有限的,例如,如果你有两个版本的参数,你可以像这样使用命名绑定(bind)

           var options1 = new CouchbaseClientDefinition
            {
                ...
            };

            var options2 = new CouchbaseClientDefinition
            {
                ...
            };

            var couchbaseCacheBucketProvider1= new CouchbaseCacheBucketProvider
            {
                ...
            };
            var couchbaseCacheBucketProvider2= new CouchbaseCacheBucketProvider
            {
                ...
            };



            Bind < ICouchbaseClientDefinition().To<CouchbaseCache>().WithConstructorArgument(couchbaseCacheBucketProvider, options1).Named("FirstBinding");
            Bind < ICouchbaseClientDefinition().To<CouchbaseCache>().WithConstructorArgument(couchbaseCacheBucketProvider, options2).Named("SecondBinding");

然而,另一种选择是使用 FactoryPattern/Singleton 来创建您的 CouchbaseCache 对象。然后你只需要注入(inject)你创建的工厂类,你可以在需要的时候使用工厂类来获取所需的 CouchbaseCache 对象。

关于c# - 使用 Ninject 加载多个绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56361152/

相关文章:

c# - 在更新表或将数据插入表之前将字符串转换为十进制

c# - 是否可以在 css 中使用 c# 变量

c# - Entity Framework 和DTO

c# - 从字符串创建开放构造类型

c# - Lucene.Net 搜索文件名/路径

c# - 与Flex交流USB设备,反之亦然

c# - 如何将带小数的数字的外国字符串表示形式转换为 double ?

c# - Ninject OnePerRequestBehaviour 似乎无法正常工作?

c# - 将 Prism 与 Ninject 结合使用

asp.net-mvc-4 - 在 .NET 4.5 中以编程方式修改 WIF 服务配置